0de8c780cc4e946f3d77836ceab1953997511b6a..868daf94f29ce1ffdd799a68c07bb668cd373bcd
2025-07-08 HP\李良庭
提交分辨率自适应版本V3.1.0.1500
868daf 对比 | 目录
已添加611个文件
98585 ■■■■■ 文件已修改
Actuator_src_2.0.3/.vs/Actuator/v16/.suo 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/Browse.VC.db 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/Solution.VC.db 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/650c6c8e4351ec6e.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/9a077151f28f1d78.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/24f61f2f6959292c/ACTUATORDEMO.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/3ef862c4023be52a/ACTUATORDEMO.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/57b28a6c9638df2/ACTUATORDEMO.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/83d1496cf9366984/ACTUATORDEMO.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/f9b00ee31162ebd8/ACTUATORDEMO.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/b80e355b91ddd758.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/db716c0affd805a6.ipch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator.sln 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/.vs/Actuator/v16/Browse.VC.db 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.aps 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.cpp 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.h 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.rc 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.vcxproj 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.vcxproj.filters 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/Actuator.vcxproj.user 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/cpp.hint 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/dllmain.cpp 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/framework.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/pch.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/pch.h 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Actuator/resource.h 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.cpp 461 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj.filters 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj.user 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.Build.CppClean.log 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.exe.recipe 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.ilk 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.log 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/ActuatorDemo.lastbuildstate 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.vcxproj.FileListAbsolute.txt 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/vc142.idb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Debug/vc142.pdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.Build.CppClean.log 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.exe.recipe 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.iobj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.ipdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.log 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/ActuatorDemo.lastbuildstate 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.vcxproj.FileListAbsolute.txt 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/ActuatorDemo/Release/vc142.pdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.Build.CppClean.log 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.dll 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.dll.recipe 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.ilk 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.log 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.pch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.res 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/Actuator.lastbuildstate 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/Actuator.write.1u.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/link.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/link.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/link.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/Actuator.vcxproj.FileListAbsolute.txt 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/dllmain.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/pch.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/vc142.idb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Debug/vc142.pdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator v2.03.dll 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.Build.CppClean.log 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.dll 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.dll.recipe 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.exp 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.iobj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.ipdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.lib 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.log 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.pch 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.pdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.res 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/Actuator.lastbuildstate 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/Actuator.write.1u.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/CL.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/CL.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/CL.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/link.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/link.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/link.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/rc.command.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/rc.read.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.tlog/rc.write.1.tlog 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/Actuator.vcxproj.FileListAbsolute.txt 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/ActuatorDemo.pdb 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/dllmain.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/pch.obj 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/Release/vc142.pdb 补丁 | 查看 | 原始文档 | blame | 历史
bin/GMMSoft.exe 补丁 | 查看 | 原始文档 | blame | 历史
bin/OpenTabTip.exe 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/config.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/conn.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/grain.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/log4me.ini 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/manager.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/config/weight.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/core/Actuator.dll 补丁 | 查看 | 原始文档 | blame | 历史
bin/core/Actuator.h 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/core/ActuatorDemo.cpp 429 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/core/ActuatorDemo.exe 补丁 | 查看 | 原始文档 | blame | 历史
bin/core/sqlite3_x86.dll 补丁 | 查看 | 原始文档 | blame | 历史
bin/data/data.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/data/test.db 补丁 | 查看 | 原始文档 | blame | 历史
bin/log/20250704.log 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/log/20250707.log 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/log/20250708.log 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/modbus_data.bin 补丁 | 查看 | 原始文档 | blame | 历史
bin/runtime/VS2018运行时库.exe 补丁 | 查看 | 原始文档 | blame | 历史
bin/runtime/部署指南.txt 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/ss20250429.csv 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/1.清除32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/2.确认32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/4.返回32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/Keyboard.cfg 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/Keyboard.dof 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/Keyboard.dpr 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/Keyboard.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/Keyboard.res 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/kb_icon.ico 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/uMain.dcu 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/uMain.ddp 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/uMain.dfm 2297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/Keyboard/uMain.pas 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Project1.cfg 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Project1.dof 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Project1.dpr 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Project1.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Project1.res 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/TabTip.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Unit1.dcu 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Unit1.ddp 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Unit1.dfm 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip/Unit1.pas 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/OpenTabTip.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Project1.cfg 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Project1.dof 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Project1.dpr 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Project1.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Project1.res 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/TabTip.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Unit1.dcu 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Unit1.ddp 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Unit1.dfm 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabTip1/Unit1.pas 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/TabletPC.cfg 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/TabletPC.dof 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/TabletPC.dpr 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/TabletPC.exe 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/TabletPC.res 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.dcu 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.ddp 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.dfm 1487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.pas 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.~ddp 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.~dfm 1487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/Unit1.~pas 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/手写图标(默认)_64.ico 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/手写图标_64.ico 补丁 | 查看 | 原始文档 | blame | 历史
demo/TabletPC/说明.txt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/原型设计-界面截图/0.首页.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/原型设计-界面截图/1.测试(手动检测).png 补丁 | 查看 | 原始文档 | blame | 历史
doc/原型设计-界面截图/2.曲线(分析).png 补丁 | 查看 | 原始文档 | blame | 历史
doc/原型设计-界面截图/3.校准.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/原型设计-界面截图/4.设置.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/微波水分仪软件修改记录-20250224.docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/Actuator.dll 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/Actuator.h 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/ActuatorDemo.cpp 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/old/Actuator.dll 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/old/Actuator.h 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/old/ActuatorDemo.cpp 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/接口设计/old/ActuatorDemo_old.cpp 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/方案设计/粮食水分仪-下位机通讯规约.docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/方案设计/粮食水分仪-协议框架.pptx 补丁 | 查看 | 原始文档 | blame | 历史
doc/方案设计/粮食水分检测仪Modinet通信协议V1.docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.0自动模式-设备就绪.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.1自动模式-修改粮种.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.2自动模式-正在检测.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.3自动模式-检测成功.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.4自动模式-PLC错误.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/1.5自动模式-切换手动-输入密码.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.1.1手动模式-检测-检测成功.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.1.2.1手动模式-仪器维护-固件版本.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.1.2手动模式-仪器维护.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.1手动模式-检测.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.2手动模式-分析.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.3.1手动模式-校准-重量校准.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.3.2.1手动模式-校准-调整截距-新增粮种.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.3.2.2手动模式-校准-调整截距-修改粮种.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.3.2手动模式-校准-调整截距.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.3手动模式-校准.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.4.1手动模式-设置-设置生效.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.4手动模式-设置.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/2.手动模式.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/3.1系统信息-保存信息.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/3.系统信息.png 补丁 | 查看 | 原始文档 | blame | 历史
doc/最新设计-界面截图/GMMSoft截图.zip 补丁 | 查看 | 原始文档 | blame | 历史
doc/水分仪下位机通讯规约 (1).docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/粮食水分仪-需求文档V1.1.docx 补丁 | 查看 | 原始文档 | blame | 历史
readme.txt 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
res/bottom.jpg 补丁 | 查看 | 原始文档 | blame | 历史
res/icon.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/lanpu.png 补丁 | 查看 | 原始文档 | blame | 历史
res/lanpu48.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/lanpu_log.png 补丁 | 查看 | 原始文档 | blame | 历史
res/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/Thumbs.db 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/activity_monitor.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/activity_monitor_add.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/activity_monitor_chart.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/activity_monitor_close.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/activity_monitor_warning.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/add_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/address_book_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/address_book_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/address_book_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/address_book_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/address_book_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_down_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_down_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_left_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_left_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_right_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_right_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_up_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/arrow_up_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_back_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_go_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/basket_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/blue_arrow_down_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/blue_arrow_left_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/blue_arrow_right_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/blue_arrow_up_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_bookmarks_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/book_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/camera_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/camera_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/camera_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/chart_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/chart_flipped_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/chart_flipped_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/clock_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/close_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_page_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_page_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/comment_user_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_page_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/database_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_forward_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_reply_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/email_reply_all_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/error_button.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/error_button_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_page_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/folder_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/hammer_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/heart_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/heart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/home_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/home_back_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/home_go_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/info_button_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/info_button_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/lightbulb_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/lightbulb_off_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/lock_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/lock_open_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/newspaper_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_blank_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_blank_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_blank_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_blank_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_blank_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_table_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_table_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_table_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_table_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_table_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_text_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_text_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_text_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_text_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/page_text_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/pencil_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/rss_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/save_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/save_download_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/save_upload_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/screen_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/screen_off_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/screwdriver_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_button_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_button_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_button_green_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_button_green_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/search_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/star_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/star_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/star_off16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/star_off_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/tools_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/twitter_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/twitter_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_blue_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_twitter_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_business_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_twitter_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/user_warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/users_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/users_business_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/warning_16.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/warning_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_error_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_error_32_add.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_error_32_close.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_rss_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/web_layout_twitter_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_blank_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_add_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_chart_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_close_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_error_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_info_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/woofunction-icons/window_app_list_search_32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/仪器维护/0.仪器维护_48.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/仪器维护/1.仪器复位.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/仪器维护/2.固件版本.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/仪器维护/3.开动作.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/仪器维护/4.关动作.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/loading.gif 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/下载加载.mp4 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/加载loading2.mp4 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/加载loading5.mp4 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/圆形-1.mp4 补丁 | 查看 | 原始文档 | blame | 历史
res/动态图标/圆形-7.mp4 补丁 | 查看 | 原始文档 | blame | 历史
res/导航条.jpg 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/11新增.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/12修改.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/13删除.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/14升.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/15降.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/1准备.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/2检测.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/2检测32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/3计算.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/3计算1.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/4保存.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/5参数生效.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/6切换.png 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/6文件夹.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/7OSK24.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/7去皮重32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/8检测32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/9测试.png 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/OSK.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/手动图标/最小化图片.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/修改32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/删除20.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/删除32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/截距.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/截距1.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/截距48.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/手写图标_64.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/手动.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/手动48.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/手动模式.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/新增.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/新增32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/确认32.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/称重.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/称重1.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/称重48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/自动.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/自动48.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/自动模式.ico 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/返回.png 补丁 | 查看 | 原始文档 | blame | 历史
res/模式图标/返回48.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/背景图.jpg 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/1退出.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/1退出32.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/2回车.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/2回车48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/3ESC.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/3ESC48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/4DEL.png 补丁 | 查看 | 原始文档 | blame | 历史
res/计算器/4Del48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/27J停止.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/901巡检、检验.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/biz-test.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/hydraulic-oil-temperature.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/ic_液位传感器.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/test (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/test (2).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/test (3).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/test (4).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/test.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分布分析.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析 (2).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析 (3).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析 (4).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析 (5).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析-copy.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析_分析.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析报表.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/分析统计.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/切换 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/切换.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/参数设置 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/参数设置 (2).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/参数设置.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/启动 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/启动.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/垂直校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/巡检、检验.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/已检验.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/开始.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/待检验.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/手动.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/数据校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/方向校准_direction-adjustment.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/暂停.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/来料品质检验.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/校准 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/校准 (2).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/校准 (3).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/检测.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/检测产品_48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/氧氮.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/水平校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/警界水位.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/计量设备校准工单.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设 置 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设 置-树菜单设置.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设 置.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设备校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设置 (1).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设置 (2).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设置 (3).png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设置 .png 补丁 | 查看 | 原始文档 | blame | 历史
res/阿里图标/设置.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/1检测.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/1检测.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/2分析.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/2分析.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/3校准.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/3校准.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/4设置.bmp 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/4设置.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/5退出.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/5退出48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/6信息.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/6信息48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/7网络48.png 补丁 | 查看 | 原始文档 | blame | 历史
res/首页图标/网络连接.png 补丁 | 查看 | 原始文档 | blame | 历史
src/GMMSoft.cfg 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/GMMSoft.dof 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/GMMSoft.dpr 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/GMMSoft.res 补丁 | 查看 | 原始文档 | blame | 历史
src/GMMSoft.~dpr 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/init/uInit.pas 616 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/init/uInit.~pas 529 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/lib/ActuatorLib.pas 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/lib/ActuatorLib.~pas 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/log/log4me.pas 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/CpuidInfo.pas 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/Global.pas 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/Global.~pas 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/MsgVar.pas 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/MultInst.pas 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/PubUtils.pas 3854 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pub/UntDes.pas 421 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/sqlite3/SQLite3.pas 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/sqlite3/SQLiteTable3.pas 1513 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/sqlite3/sqlite3udf.pas 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/grainThread.pas 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/grainThread.~pas 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/interceptThread.pas 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/interceptThread.~pas 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/mantestThread.pas 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/mantestThread.~pas 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/readyThread.pas 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/resetThread.pas 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/resetThread.~pas 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/statusThread.pas 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/statusThread.~pas 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/testThread - 副本.pas 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/testThread.pas 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/testThread.~pas 332 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/verifyThread.pas 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/verifyThread.~pas 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/thread/vreadyThread.pas 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.dfm 2628 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.pas 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.~ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.~dfm 2628 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uCalc.~pas 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.dfm 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.pas 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.~ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.~dfm 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uDM.~pas 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uInput.ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uInput.dfm 1416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uInput.pas 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.dfm 29356 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.pas 1921 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.~ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.~dfm 29652 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uMain.~pas 1521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uSaveData.pas 924 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uSaveData.~pas 781 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uTablet.ddp 补丁 | 查看 | 原始文档 | blame | 历史
src/uTablet.dfm 1845 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uTablet.pas 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uTablet.~dfm 1844 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/uTablet.~pas 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Actuator_src_2.0.3/.vs/Actuator/v16/.suo
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/Browse.VC.db
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/Solution.VC.db
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/650c6c8e4351ec6e.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/9a077151f28f1d78.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/24f61f2f6959292c/ACTUATORDEMO.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/3ef862c4023be52a/ACTUATORDEMO.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/57b28a6c9638df2/ACTUATORDEMO.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/83d1496cf9366984/ACTUATORDEMO.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/AutoPCH/f9b00ee31162ebd8/ACTUATORDEMO.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/b80e355b91ddd758.ipch
Binary files differ
Actuator_src_2.0.3/.vs/Actuator/v16/ipch/db716c0affd805a6.ipch
Binary files differ
Actuator_src_2.0.3/Actuator.sln
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.33027.164
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Actuator", "Actuator\Actuator.vcxproj", "{D4F1D04E-459B-4129-895F-8C4498181670}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ActuatorDemo", "ActuatorDemo\ActuatorDemo.vcxproj", "{5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}"
    ProjectSection(ProjectDependencies) = postProject
        {D4F1D04E-459B-4129-895F-8C4498181670} = {D4F1D04E-459B-4129-895F-8C4498181670}
    EndProjectSection
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|x64 = Debug|x64
        Debug|x86 = Debug|x86
        Release|x64 = Release|x64
        Release|x86 = Release|x86
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {D4F1D04E-459B-4129-895F-8C4498181670}.Debug|x64.ActiveCfg = Debug|x64
        {D4F1D04E-459B-4129-895F-8C4498181670}.Debug|x64.Build.0 = Debug|x64
        {D4F1D04E-459B-4129-895F-8C4498181670}.Debug|x86.ActiveCfg = Debug|Win32
        {D4F1D04E-459B-4129-895F-8C4498181670}.Debug|x86.Build.0 = Debug|Win32
        {D4F1D04E-459B-4129-895F-8C4498181670}.Release|x64.ActiveCfg = Release|x64
        {D4F1D04E-459B-4129-895F-8C4498181670}.Release|x64.Build.0 = Release|x64
        {D4F1D04E-459B-4129-895F-8C4498181670}.Release|x86.ActiveCfg = Release|Win32
        {D4F1D04E-459B-4129-895F-8C4498181670}.Release|x86.Build.0 = Release|Win32
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Debug|x64.ActiveCfg = Debug|x64
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Debug|x64.Build.0 = Debug|x64
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Debug|x86.ActiveCfg = Debug|Win32
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Debug|x86.Build.0 = Debug|Win32
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Release|x64.ActiveCfg = Release|x64
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Release|x64.Build.0 = Release|x64
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Release|x86.ActiveCfg = Release|Win32
        {5D3C7800-F22D-43F8-B9DA-C3F8F68A1B2E}.Release|x86.Build.0 = Release|Win32
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {19B3C640-C439-4777-B059-4F000B348506}
    EndGlobalSection
EndGlobal
Actuator_src_2.0.3/Actuator/.vs/Actuator/v16/Browse.VC.db
Binary files differ
Actuator_src_2.0.3/Actuator/Actuator.aps
Binary files differ
Actuator_src_2.0.3/Actuator/Actuator.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,383 @@
// Actuator.cpp : å®šä¹‰ DLL çš„导出函数。
//
#include "pch.h"
#include "framework.h"
#include "Actuator.h"
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "../../libmodbus-3.1.10/src/modbus.h"
int nGoodtype = 1;
ACTUATOR_API void* __stdcall CreatePlcDevice(const char* strIp, int nPort)
{
    modbus_t* ctx = modbus_new_tcp(strIp, nPort);
    modbus_set_slave(ctx, 1);
    //modbus_set_debug(ctx, TRUE);
    modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK);
    return ctx;
}
//创建水分仪句柄
ACTUATOR_API void* __stdcall CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit)
{
    modbus_t* ctx = modbus_new_rtu(szSerialPort, baud, parity, data_bit, stop_bit);
    modbus_set_slave(ctx, 1);
    //modbus_set_debug(ctx, TRUE);
    modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK);
    return ctx;
}
ACTUATOR_API int __stdcall Disconnect(void* ctxDev)
{
    if (NULL == ctxDev) return 1;
    modbus_t* ctx = (modbus_t*)ctxDev;
    if (NULL == ctx) return 1;
    modbus_close(ctx);
    return 1;
}
//断开设备的连接
ACTUATOR_API int __stdcall DestroyDevice(void* ctxDev)
{
    if (NULL == ctxDev) return 1;
    modbus_t* ctx = (modbus_t*)ctxDev;
    if (NULL == ctx) return 1;
    modbus_free(ctx);
    return 1;
}
ACTUATOR_API int __stdcall ConnectDevice(void* ctxDev)
{
    if (NULL == ctxDev) return -1;
    modbus_t* ctx = (modbus_t*)ctxDev;
    return modbus_connect(ctx);
}
//从客户PLC获取粮种信息和状态信息
ACTUATOR_API int __stdcall ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType)
{
    if (NULL == ctxDev) return -1;
    uint16_t tab_rp_registers[8] = { 0 };
    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, 3, tab_rp_registers);
    if (rc > 0)
    {
        *nGrainType = tab_rp_registers[0]; //粮种信息
        switch (tab_rp_registers[0])
        {//PLC ç²®é£Ÿ ID è½¬ è£…ç½® ç²®é£Ÿ  ID
        case 1: //PLC稻谷
            *nGrainType = 2;
            break;
        case 2: //PLC玉米
            *nGrainType = 4;
            break;
        case 3: //PLC黄豆
            *nGrainType = 3;
            break;
        case 4: //PLC小麦
            *nGrainType = 1;
            break;
        }
        *nState = tab_rp_registers[2]; //交互寄存器
    }
    return rc;
}
//写状态给客户PLC
ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState)
{
    if (NULL == ctxDev) return -1;
    unsigned short nStates[1] = { nState };
    int rc = modbus_write_registers((modbus_t*)ctxDev, 2, 1, nStates);
    return rc;
}
//上传数据到客户PLC
ACTUATOR_API int __stdcall UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize)
{
    if (NULL == ctxDev && nSize < 3) return -1;
    switch(nDatas[0])
    {//设备粮种信息,转PLC两种信息
    case 1: //小麦
        nDatas[0] = 4;
        break;
    case 2: //水稻
        nDatas[0] = 1;
        break;
    case 3: //黄豆
        nDatas[0] = 3;
        break;
    case 4: //玉米
        nDatas[0] = 2;
        break;
    }
    //2 å’Œ 1交换。
    unsigned short nVal = nDatas[1]; //水分
    nDatas[1] = nDatas[2];//水分和容重交换
    nDatas[2] = nVal;
    int rc = modbus_write_registers((modbus_t*)ctxDev, 1, 1, nDatas);
    rc = modbus_write_registers((modbus_t*)ctxDev, 3, 2, &nDatas[1]);
    return rc;
}
int ExeCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000)
{
    if (NULL == ctxDev) return -1;
    unsigned char cmdType = (unsigned char)nCmdType;
    unsigned char grainType = (unsigned char)nGrainType;
    uint16_t val = (cmdType << 8) | grainType;
    //int val = (grainType << 8) | cmdType;
    uint32_t nOldSeconds = 0;
    uint32_t nOldUSeonds = 0;
    //获取旧时间
    modbus_get_response_timeout((modbus_t*)ctxDev, &nOldSeconds, &nOldUSeonds);
    //设置新时间
    modbus_set_response_timeout((modbus_t*)ctxDev, nResponseSeconds, nResponseUSeconds);
    int rc = modbus_write_register((modbus_t*)ctxDev, 0, val);
    //恢复旧时间
    modbus_set_response_timeout((modbus_t*)ctxDev, nOldSeconds, nOldUSeonds);
    return rc;
}
//向水分仪发命令
ACTUATOR_API int __stdcall SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType, unsigned int nResponseSeconds, unsigned int nResponseUSeconds)
{
    if (NULL == ctxDev) return -1;
    int ret = 0;
    //unsigned char cmdType = (unsigned char)nCmdType;
    //unsigned char grainType = (unsigned char)nGrainType;
    if (nGrainType > 0) //保持粮食品种信息
        nGoodtype = nGrainType;
    if (nCmdType == WR_VERIFY)
    {//校准检测时候下发粮食品种信息
        ret = ExeCommands(ctxDev, WR_GOODS, nGoodtype);
        if (ret < 0)
            printf("下发粮种失败!\n");
        else
            ret = ExeCommands(ctxDev, WR_DETECT, nGrainType, nResponseSeconds, nResponseUSeconds);
        return ret;
    }
    else
        ret = ExeCommands(ctxDev, nCmdType, nGrainType, nResponseSeconds, nResponseUSeconds);
    return ret;
}
//向水分仪写参数
ACTUATOR_API int __stdcall WriteParams(void* ctxDev,
               unsigned short nStartFreq,
               unsigned short nStopFreq,
               unsigned short nStepFreq,
               unsigned short nDecayCode,
               unsigned short nAscValid )
{
    if (NULL == ctxDev) return -1;
    unsigned short nParams[10] = {nStartFreq,nStopFreq,nStepFreq,nDecayCode,nAscValid };
    int rc = modbus_write_registers((modbus_t*)ctxDev, 5, 5, nParams);
    return rc;
}
//从水分仪写参数 ï¼ˆä»Ž0号寄存器开始,0号寄存器为电平,1号为重量,2号为温度,3号为湿度 ï¼‰
ACTUATOR_API int __stdcall ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize)
{
    if (NULL == ctxDev) return -1;
    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, nSize, nDatas);
    return rc;
}
//读校准数据 ï¼ˆ10号寄存器)
ACTUATOR_API int __stdcall ReadVcc(void* ctxDev, unsigned short* nVcc)
{
    if (NULL == ctxDev) return -1;
    //int rc = modbus_read_registers((modbus_t*)ctxDev, 10, 1, nVcc);
    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, 1, nVcc);
    return rc;
}
//单独读重量数据 ï¼ˆ1号寄存器)
ACTUATOR_API int __stdcall ReadWeight(void* ctxDev, unsigned short* nWeight)
{
    if (NULL == ctxDev) return -1;
    uint32_t nOldSeconds = 0;
    uint32_t nOldUSeonds = 0;
    //获取旧时间
    modbus_get_response_timeout((modbus_t*)ctxDev, &nOldSeconds, &nOldUSeonds);
    //设置新时间
    modbus_set_response_timeout((modbus_t*)ctxDev, 10, 0);
    int rc = modbus_read_registers((modbus_t*)ctxDev, 1, 1, nWeight);
    //恢复旧时间
    modbus_set_response_timeout((modbus_t*)ctxDev, nOldSeconds, nOldUSeonds);
    return rc;
}
ACTUATOR_API int __stdcall Linearize(float x[], float y[], double Coefficient[], const int n, const int nSampleNumber)
{
    float A[2] = { 0 }, B[2] = { 0 }, C;
    //float Y[3][nSampleNumber] = { 0 };
    float* yAlt = new float[3 * nSampleNumber];
    float (*Y)[3] = (float (*)[3])yAlt;
    float temp;
    //float Co[3][n + 1] = { 0 };
    float* coAlt = new float[3 * (n + 1)];
    float (*Co)[3] = (float(*)[3])coAlt;
    memset(yAlt, 0, sizeof(float) * (3 * nSampleNumber));
    memset(coAlt, 0, sizeof(float) * (3 * (n + 1)));
    unsigned char i, j;
    // float x[]={0,1,2,3,4,5,6,7,8,9,10,11};
    // float y[]={2506,2200,1846,1440,1004,548,79,-387,-847,-1288,-1700,-2066};
    int ret = 1;
    try
    {
        C = 0;
        for (i = 0; i < nSampleNumber; i++)
        {
            Y[0][i] = 1;
            C += y[i];
            A[0] += x[i];
        }
        A[0] /= nSampleNumber;
        C /= nSampleNumber;
        Co[0][0] = 1;
        Coefficient[0] = C;
        C = 0;
        for (i = 0; i < nSampleNumber; i++)
        {
            Y[1][i] = x[i] - A[0];
            C += Y[1][i] * y[i];
            B[0] += Y[1][i] * Y[1][i];
            A[1] += x[i] * Y[1][i] * Y[1][i];
        }
        A[1] /= B[0];
        C /= B[0];
        B[0] /= nSampleNumber;
        Co[1][0] = -1 * A[0];
        Co[1][1] = 1;
        A[0] = A[1];
        Coefficient[0] += Co[1][0] * C;
        Coefficient[1] = Co[1][1] * C;
        for (i = 2; i <= n; i++)
        {
            temp = 0;
            C = 0;
            A[1] = 0;
            B[1] = 0;
            for (j = 0; j < nSampleNumber; j++)
            {
                Y[2][j] = Y[1][j];
                Y[2][j] *= (x[j] - A[0]);
                Y[2][j] -= (B[0] * Y[0][j]);
                C += Y[2][j] * y[j];
                temp += Y[2][j] * Y[2][j];
                if (i < n)
                {
                    A[1] += x[j] * Y[2][j] * Y[2][j];
                    B[1] += Y[1][j] * Y[1][j];
                }
                Y[0][j] = Y[1][j];
                Y[1][j] = Y[2][j];
            }
            C /= temp;
            for (j = i; j >= 1; j--)
            {
                Co[2][j] = Co[1][j - 1];
            }
            for (j = 0; j < i; j++)
            {
                Co[2][j] -= Co[1][j] * A[0];
            }
            for (j = 0; j <= i - 2; j++)
            {
                Co[0][j] *= B[0];
                Co[2][j] -= Co[0][j];
            }
            for (j = 0; j <= i; j++)
            {
                Co[0][j] = Co[1][j];
                Co[1][j] = Co[2][j];
                Co[2][j] = 0;
            }
            for (j = 0; j <= i; j++)
            {
                Coefficient[j] += C * Co[1][j];
            }
            if (i < n)
            {
                B[0] = temp / B[1];
                A[0] = A[1] / temp;
            }
        }
    }
    catch(...)
    {
        ret = -1;
    }
    if(yAlt) delete yAlt;
    if(coAlt) delete coAlt;
    return ret;
}
ACTUATOR_API double __stdcall CalcValue(unsigned short nDValue, double Coef0, double Coef1, double Coef2, double Coef3, double Coef4)
{
    return (
        Coef0 +
        Coef1 * nDValue +
        Coef2 * nDValue * nDValue +
        Coef3 * nDValue * nDValue * nDValue +
        Coef4 * nDValue * nDValue * nDValue * nDValue
        );
}
Actuator_src_2.0.3/Actuator/Actuator.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
LIBRARY
EXPORTS
CreatePlcDevice
CreateWrDevice
ConnectDevice
ReadState
ResponseState
UploadData
SendCommands
WriteParams
ReadDatas
ReadVcc
ReadWeight
Disconnect
DestroyDevice
Linearize
CalcValue
Actuator_src_2.0.3/Actuator/Actuator.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,184 @@
// ä¸‹åˆ— ifdef å—是创建使从 DLL å¯¼å‡ºæ›´ç®€å•çš„
// å®çš„æ ‡å‡†æ–¹æ³•。此 DLL ä¸­çš„æ‰€æœ‰æ–‡ä»¶éƒ½æ˜¯ç”¨å‘½ä»¤è¡Œä¸Šå®šä¹‰çš„ ACTUATOR_EXPORTS
// ç¬¦å·ç¼–译的。在使用此 DLL çš„
// ä»»ä½•项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ACTUATOR_API å‡½æ•°è§†ä¸ºæ˜¯ä»Ž DLL å¯¼å…¥çš„,而此 DLL åˆ™å°†ç”¨æ­¤å®å®šä¹‰çš„
// ç¬¦å·è§†ä¸ºæ˜¯è¢«å¯¼å‡ºçš„。
#ifdef ACTUATOR_EXPORTS
#define ACTUATOR_API __declspec(dllexport)
#else
#define ACTUATOR_API __declspec(dllimport)
#endif
typedef enum
{
    //粮种准备命令代码(粮种已修改)
    READY_GRAIN = 0x01,
    //返回准备完成
    READY_FINISH = 0x02,
    //检测启动命令
    DETECT_START = 0x03,
    //返回检测完毕
    DETECT_FINISH = 0x04,
    //设备水分仪复位命令
    DEVICE_WR_RESET = 0xFE,
    //返回水分仪故障代码
    DEVICE_WR_FAULT = 0xFF
}PLCWORD;
typedef enum
{
    //水分仪准备指令
    WR_READY = 0x01,
    //水分仪检测指令
    WR_DETECT = 0x02,
    //水分仪校验指令
    WR_VERIFY = 0x03,
    //水分仪复位指令
    WR_RESET = 0x04,
    //粮食变更指令
    WR_GOODS = 0x05
}WRWORD;
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   ç½‘络端口
ACTUATOR_API void* __stdcall CreatePlcDevice(const char* strIp, int nPort);
//创建水分仪句柄ctx
//szSerialPort:   ä¸²å£å
//baud:       æ³¢ç‰¹çއ
//parity:     æ ¡éªŒç±»åž‹
//data_bit:   æ•°æ®ä½
//stop_bit:   åœæ­¢ä½
ACTUATOR_API void* __stdcall CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
//连接客户设备或水分仪装置
//ctxDev : è®¾å¤‡å¥æŸ„
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ConnectDevice(void* ctxDev);
//获取状态或粮种更改信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x03:  å¼€å§‹æµ‹è¯•
//         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
//         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
//写回状态
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x02:  å‡†å¤‡å·²å®Œæˆ
//         0x04:  æ£€æµ‹å®Œæˆ
//         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState);
//回传检测数据
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç²®ç§ç¼–码
//         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
//         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
//nSize  : æ•°æ®ä¸ªæ•°
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
//下发命令信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nCmdType ï¼šå‘½ä»¤å­—,如下描述
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x02:  å¼€å§‹æµ‹è¯•
//         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
// nResponseSeconds: å“åº”时间,以秒计算
// nResponseUSeconds: å“åº”时间,以微妙计算,若小于秒,全部用微妙表示。
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
//下发参数
//ctxDev : è®¾å¤‡å¥æŸ„
//nStartFreq ï¼šèµ·å§‹é¢‘率
//nStopFreq ï¼š ç»ˆæ­¢é¢‘率
//nStepFreq ï¼š æ­¥é•¿
//nDecayCode ï¼šè¡°å‡ç 
//nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
                            unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
//读取检测信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç”µåދ值
//         é‡é‡
//         æ¸©åº¦
//         æ¹¿åº¦
// nSize : è¯»å–4个寄存器
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
//读取扫频值,其实为电平值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nVcc   ï¼šç”µå¹³å€¼æŒ‡é’ˆ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadVcc(void* ctxDev, unsigned short* nVcc);
//读重量值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nWeight ï¼šé‡é‡å€¼
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadWeight(void* ctxDev, unsigned short* nWeight);
//断开水分仪或客户设备的连接
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall Disconnect(void* ctxDev);
//销毁资源
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall DestroyDevice(void* ctxDev);
//算法函数
//x ä¸ºæµ‹é‡å€¼
//y ä¸ºå®žé™…值
//n ä¸ºæ‹Ÿåˆæ¬¡æ•°
//nSampleNumber æ ·æœ¬æ•°é‡
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
//计算函数
ACTUATOR_API double __stdcall CalcValue(unsigned short nDValue, double Coef0, double Coef1, double Coef2, double Coef3, double Coef4);
Actuator_src_2.0.3/Actuator/Actuator.rc
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// ä¸­æ–‡(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END
2 TEXTINCLUDE
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END
3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
 FILEVERSION 2,0,3,0
 PRODUCTVERSION 2,0,3,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080404b0"
        BEGIN
            VALUE "CompanyName", "上海兰宝传感科技股份有限公司"
            VALUE "FileDescription", "Shanghai Lanbao Sensing Technology"
            VALUE "FileVersion", "2.0.3.0"
            VALUE "InternalName", "Actuator.dll"
            VALUE "LegalCopyright", "Copyright (C) 2023 Lanbao Sensing Technology"
            VALUE "OriginalFilename", "Actuator.dll"
            VALUE "ProductName", "Actuator Library"
            VALUE "ProductVersion", "2.0.3.0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200
    END
END
#endif    // ä¸­æ–‡(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
Actuator_src_2.0.3/Actuator/Actuator.vcxproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>16.0</VCProjectVersion>
    <Keyword>Win32Proj</Keyword>
    <ProjectGuid>{d4f1d04e-459b-4129-895f-8c4498181670}</ProjectGuid>
    <RootNamespace>Actuator</RootNamespace>
    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
    <TargetName>Actuator</TargetName>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
    <TargetName>Actuator</TargetName>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
    <TargetName>Actuator</TargetName>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LinkIncremental>false</LinkIncremental>
    <TargetName>Actuator</TargetName>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;_DEBUG;ACTUATOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <AdditionalLibraryDirectories>../../libmodbus-3.1.10/src/win32</AdditionalLibraryDirectories>
      <AdditionalDependencies>modbus.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <ModuleDefinitionFile>Actuator.def</ModuleDefinitionFile>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;NDEBUG;ACTUATOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <AdditionalLibraryDirectories>../../libmodbus-3.1.10/src/win32</AdditionalLibraryDirectories>
      <AdditionalDependencies>modbus.lib;ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <ModuleDefinitionFile>Actuator.def</ModuleDefinitionFile>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>_DEBUG;ACTUATOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>NDEBUG;ACTUATOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <None Include="cpp.hint" />
    <None Include="Actuator.def" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="Actuator.h" />
    <ClInclude Include="framework.h" />
    <ClInclude Include="pch.h" />
    <ClInclude Include="resource.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="Actuator.cpp" />
    <ClCompile Include="dllmain.cpp" />
    <ClCompile Include="pch.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Actuator.rc" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>
Actuator_src_2.0.3/Actuator/Actuator.vcxproj.filters
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="源文件">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="头文件">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
    </Filter>
    <Filter Include="资源文件">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <None Include="cpp.hint" />
    <None Include="Actuator.def">
      <Filter>源文件</Filter>
    </None>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="framework.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="Actuator.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="pch.h">
      <Filter>头文件</Filter>
    </ClInclude>
    <ClInclude Include="resource.h">
      <Filter>头文件</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="Actuator.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="dllmain.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="pch.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Actuator.rc">
      <Filter>资源文件</Filter>
    </ResourceCompile>
  </ItemGroup>
</Project>
Actuator_src_2.0.3/Actuator/Actuator.vcxproj.user
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerCommand>ActuatorDemo.exe</LocalDebuggerCommand>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
  </PropertyGroup>
</Project>
Actuator_src_2.0.3/Actuator/cpp.hint
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
#define ACTUATOR_API __declspec(dllexport)
#define ACTUATOR_API __declspec(dllimport)
Actuator_src_2.0.3/Actuator/dllmain.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
// dllmain.cpp : å®šä¹‰ DLL åº”用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Actuator_src_2.0.3/Actuator/framework.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
#pragma once
#define WIN32_LEAN_AND_MEAN             // ä»Ž Windows å¤´æ–‡ä»¶ä¸­æŽ’除极少使用的内容
// Windows å¤´æ–‡ä»¶
#include <windows.h>
Actuator_src_2.0.3/Actuator/pch.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
// pch.cpp: ä¸Žé¢„编译标头对应的源文件
#include "pch.h"
// å½“使用预编译的头时,需要使用此源文件,编译才能成功。
Actuator_src_2.0.3/Actuator/pch.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
// pch.h: è¿™æ˜¯é¢„编译标头文件。
// ä¸‹æ–¹åˆ—出的文件仅编译一次,提高了将来生成的生成性能。
// è¿™è¿˜å°†å½±å“ IntelliSense æ€§èƒ½ï¼ŒåŒ…括代码完成和许多代码浏览功能。
// ä½†æ˜¯ï¼Œå¦‚果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// è¯·å‹¿åœ¨æ­¤å¤„添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// æ·»åŠ è¦åœ¨æ­¤å¤„é¢„ç¼–è¯‘çš„æ ‡å¤´
#include "framework.h"
#endif //PCH_H
Actuator_src_2.0.3/Actuator/resource.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Actuator.rc
// æ–°å¯¹è±¡çš„下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,461 @@
// ActuatorDemo.cpp : æ­¤æ–‡ä»¶åŒ…含 "main" å‡½æ•°ã€‚程序执行将在此处开始并结束。
//
#include <iostream>
#include "../Actuator//Actuator.h"
//系数
const double coef[5] = { -6.204673384923,0.025161776479,-0.000014765722,0.000000003440,0 };
void ExeTest()
{
    void* hPlcDev = CreatePlcDevice("192.168.0.10", 502);
    void* hWrDev = CreateWrDevice("COM1", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hPlcDev) ret = ConnectDevice(hPlcDev);
    if (hWrDev) ret = ConnectDevice(hWrDev);
    char ch = 0;
    while ('c' != (ch = getchar()))  //按 c é€€å‡ºè‡ªåŠ¨æ£€æµ‹
    {
        //读PLC状态字
        ret = ReadState(hPlcDev, &nState, &nGrainType);
        if (ret <= 0)
        {
            printf("读取PLC状态字异常!\n");
        }
        else
        {
            //代表读取到数据
            if (nGrainType > 0 && nState > 0)
            {
                //下面是主流程的处理
                switch (nState)
                {
                case READY_GRAIN: //粮食品种修改了
                {
                    //向水分仪发粮种更改,启动准备
                    ret = SendCommands(hWrDev, WR_READY, nGrainType, 20, 0);
                    if (ret <= 0)
                    {
                        printf("粮食品种修改失败!水分仪故障!\n");
                        ret = ResponseState(hPlcDev, DEVICE_WR_FAULT);
                    }
                    else
                    {
                        printf("粮食品种修改成功!准备就绪\n");
                        ret = ResponseState(hPlcDev, READY_FINISH);
                    }
                }
                break;
                case DETECT_START: //开始测试
                {
                    ret = SendCommands(hWrDev, WR_DETECT, 0, 30, 0);
                    if (ret <= 0)
                    {
                        printf("执行检测失败!\n");
                        ret = ResponseState(hPlcDev, DEVICE_WR_FAULT);
                    }
                    else
                    {
                        unsigned short nDatas[10] = { 0 };
                        unsigned short nSendData[3] = { 0 };
                        //从水分仪器读取数据
                        ret = ReadDatas(hWrDev, nDatas);
                        printf("执行检测成功!\n");
                        ret = ResponseState(hPlcDev, DETECT_FINISH);
                        //计算水分率
                        double v = coef[0] +
                            coef[1] * nDatas[0] +
                            coef[2] * nDatas[0] * nDatas[0] +
                            coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                            coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                        nSendData[0] = 0x01; // ç²®é£Ÿå“ç§
                        nSendData[1] = 100 * v; // 21.30% //含水率
                        nSendData[2] = 100 * nDatas[1] / 0.52; // 51.50; //容重比
                        printf("Get Vals: wr:%f, weight:%f, temperatur:%f, humidity:%f",
                            v,
                            nDatas[1],
                            nDatas[2] / 100.f,
                            nDatas[3] / 100.f);
                        ret = UploadData(hPlcDev, nSendData);
                    }
                }
                break;
                case DEVICE_WR_RESET: //复位命令
                {
                    ret = SendCommands(hWrDev, WR_RESET, 0, 20, 0);
                    if (ret <= 0)
                    {
                        printf("复位失败!\n");
                        ret = ResponseState(hPlcDev, DEVICE_WR_FAULT);
                    }
                    else
                    {
                        printf("复位成功!\n");
                    }
                }
                break;
                default:
                    break;
                }
            }
        }
    }
    if (hPlcDev) Disconnect(hPlcDev);
    if (hPlcDev) DestroyDevice(hPlcDev);
    if (hWrDev) Disconnect(hWrDev);
    if (hWrDev) DestroyDevice(hWrDev);
}
//手动写参数
void ExeWriteParam()
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = WriteParams(hWrDev, 10500, 12000, 50, 1, 1);
    if (ret <= 0)
        printf("下发参数失败!\n");
    if (hWrDev) DestroyDevice(hWrDev);
}
void ExeManReady()
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_READY, 0x01, 20, 0); //下发确认
    if (ret <= 0)
        printf("准备失败!\n");
    else
    {
        printf("准备就绪,OK!\n");
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
//手动检测
void ExeManTest()
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_DETECT, 0, 30, 0); //执行启动命令
    if (ret <= 0)
    {
        printf("执行检测失败!\n");
    }
    else
    {
        unsigned short nDatas[10] = { 0 };
        //从水分仪器读取数据
        ret = ReadDatas(hWrDev, nDatas);
        //第一个值为电平值,用来计算水分率
        double v = coef[0] +
            coef[1] * nDatas[0] +
            coef[2] * nDatas[0] * nDatas[0] +
            coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
            coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
        v = CalcValue(nDatas[0], coef[0], coef[1], coef[2], coef[3], coef[4]);
        printf(" After Detection,");
        printf(" %d %d %d %d", nDatas[0], nDatas[1], nDatas[2], nDatas[3]);
        printf(" Water Rate:%lf", v);
        printf(" \n");
        printf("检测执行OK!\n");
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
void DirectDetect(char nType)
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = nType-48;
    int ret = 0;
    if (nGrainType < 1 && nGrainType>4)
    {
        printf("粮食信息非法!\r\n");
        return;
    }
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_GOODS, nGrainType); //执行启动命令
    if (ret <= 0)
    {
        printf("下发粮种信息失败!\n");
    }
    else
    {
        ret = SendCommands(hWrDev, WR_DETECT, 0, 30, 0); //执行启动命令
        if (ret <= 0)
        {
            printf("执行检测失败!\n");
        }
        else
        {
            unsigned short nDatas[10] = { 0 };
            //从水分仪器读取数据
            ret = ReadDatas(hWrDev, nDatas);
            //第一个值为电平值,用来计算水分率
            double v = coef[0] +
                coef[1] * nDatas[0] +
                coef[2] * nDatas[0] * nDatas[0] +
                coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
            v = CalcValue(nDatas[0], coef[0], coef[1], coef[2], coef[3], coef[4]);
            printf(" After Detection,");
            printf(" Orig Val: %d %d %d %d", nDatas[0], nDatas[1], nDatas[2], nDatas[3]);
            printf(" -->Water Rate:%lf", v);
            printf(" \n");
            printf("检测执行OK!\n");
        }
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
//
void ExeVerifyTest()
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_VERIFY, 0, 30, 0); //执行校准命令
    if (ret <= 0)
    {
        printf("校准执行失败!\n");
    }
    else
    {
        unsigned short nVcc = 0;
        //从水分仪器读取数据
        ret = ReadVcc(hWrDev, &nVcc);
        printf(" Detected Val: %d", nVcc);
        printf(" \n");
        printf("校准执行OK!\n");
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
void ExeZero()
{
    void* hWrDev = CreateWrDevice("COM6", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_RESET, 0, 15, 0); //下发复位
    if (ret <= 0)
    {
        printf("复位失败!\n");
    }
    else
    {
        printf("复位成功!\n");
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
void ReadWeight()
{
    void* hWrDev = CreateWrDevice("COM1", 115200, 'N', 8, 1);
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    unsigned short nWeight = 0;
    //从水分仪器读取数据
    ret = ReadWeight(hWrDev, &nWeight);
    if (ret >= 0)
    {
        printf(" Weight Val: %d", nWeight);
        printf(" \n");
        printf("称重执行OK!\n");
    }
    else
    {
        printf("称重执行失败!\n");
    }
    if (hWrDev) DestroyDevice(hWrDev);
}
void TestLinearize()
{
    int nSampeCount = 12;
     float x[]={0,1,2,3,4,5,6,7,8,9,10,11}; //realval
     float y[]={2506,2200,1846,1440,1004,548,79,-387,-847,-1288,-1700,-2066}; //input
     double coef[5] = { 0 };
     int ret = Linearize(x, y, coef, 2, nSampeCount);
     if (ret > 0)
     {
         printf("Coef: %f, %f, %f, %f, %f\n", coef[0], coef[1], coef[2], coef[3], coef[4]);
         float v = 3.0f;
         printf("Input %lf, Cal Val:%lf\n", v,
             (coef[0] +
                 coef[1] * v +
                 coef[2] * v * v +
                 coef[3] * v * v * v +
                 coef[4] * v * v * v * v)
         );
     }
}
int main()
{
    std::cout << "Hello World!\n";
    //double val = 11531998.626;
    //unsigned char sval[32] = { 0 };
    //memcpy(sval, &val, 8);
    //unsigned char sv2[] = { 0x27, 0x31, 0x08, 0xd4, 0xdb, 0xfe, 0x65, 0x41 };
    //val = *(double*)sv2;
    //
    //unsigned short sv3[] = { 0x3127, 0xd408, 0xfedb, 0x4165 };
    //val = *(double*)sv3;
    //unsigned short sv4[] = { 0x2731, 0x08d4, 0xdbfe, 0x6541 };
    //val = *(double*)sv4;
    //unsigned short sv5[] = { 0x4165, 0xfedb, 0xd408, 0x3127 };
    //val = *(double*)sv5;
    char ch = 0;
    while ('x' != ( ch = getchar() )) //按 x é€€å‡ºç¨‹åº
    {
        switch (ch)
        {
            case 'a': //自动测试
                ExeTest();
                break;
            case 'p': //向水份仪下发参数
                ExeWriteParam();
                break;
            case 'r': //手动检测,需要准备
                ExeManReady();
                break;
            case 'd': //手动检测,不许准备
                ExeManTest();
                break;
            case 'v':  //校准
                ExeVerifyTest();
                break;
            case 'z':  //复位清零
                ExeZero();
                break;
            case 'l': //拟合测试
                TestLinearize();
                break;
            case '1':
            case '2':
            case '3':
            case '4':
                DirectDetect(ch);
                break;
            case 'w':
                ReadWeight();
                break;
            default:
                break;
        }
    }
}
// è¿è¡Œç¨‹åº: Ctrl + F5 æˆ–调试 >“开始执行(不调试)”菜单
// è°ƒè¯•程序: F5 æˆ–调试 >“开始调试”菜单
// å…¥é—¨ä½¿ç”¨æŠ€å·§:
//   1. ä½¿ç”¨è§£å†³æ–¹æ¡ˆèµ„源管理器窗口添加/管理文件
//   2. ä½¿ç”¨å›¢é˜Ÿèµ„源管理器窗口连接到源代码管理
//   3. ä½¿ç”¨è¾“出窗口查看生成输出和其他消息
//   4. ä½¿ç”¨é”™è¯¯åˆ—表窗口查看错误
//   5. è½¬åˆ°â€œé¡¹ç›®â€>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. å°†æ¥ï¼Œè‹¥è¦å†æ¬¡æ‰“开此项目,请转到“文件”>“打开”>“项目”并选择 .sln æ–‡ä»¶
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>16.0</VCProjectVersion>
    <Keyword>Win32Proj</Keyword>
    <ProjectGuid>{5d3c7800-f22d-43f8-b9da-c3f8f68a1b2e}</ProjectGuid>
    <RootNamespace>ActuatorDemo</RootNamespace>
    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <AdditionalDependencies>Actuator.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>..\..\Actuator\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <AdditionalDependencies>Actuator.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>..\..\Actuator\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="ActuatorDemo.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj.filters
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="源文件">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="头文件">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
    </Filter>
    <Filter Include="资源文件">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="ActuatorDemo.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
  </ItemGroup>
</Project>
Actuator_src_2.0.3/ActuatorDemo/ActuatorDemo.vcxproj.user
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
</Project>
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.Build.CppClean.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
f:\workspace_lssf\actuator\actuatordemo\debug\vc142.pdb
f:\workspace_lssf\actuator\actuatordemo\debug\vc142.idb
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.obj
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.ilk
f:\workspace_lssf\actuator\debug\actuatordemo.exe
f:\workspace_lssf\actuator\debug\actuatordemo.pdb
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\cl.command.1.tlog
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\cl.read.1.tlog
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\cl.write.1.tlog
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\link.command.1.tlog
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\link.read.1.tlog
f:\workspace_lssf\actuator\actuatordemo\debug\actuatordemo.tlog\link.write.1.tlog
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.exe.recipe
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <ProjectOutputs>
    <ProjectOutput>
      <FullPath>F:\workspace_LSSF\Actuator\Debug\ActuatorDemo.exe</FullPath>
    </ProjectOutput>
  </ProjectOutputs>
  <ContentFiles />
  <SatelliteDlls />
  <NonRecipeFileRefs />
</Project>
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.ilk
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
  ActuatorDemo.cpp
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(81,40): warning C4244: â€œ=”: ä»Žâ€œdouble”转换到“unsigned short”,可能丢失数据
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(82,52): warning C4244: â€œ=”: ä»Žâ€œdouble”转换到“unsigned short”,可能丢失数据
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(84,28): warning C4477: â€œprintf”: æ ¼å¼å­—符串“%f”需要类型“double”的参数,但可变参数 2 æ‹¥æœ‰äº†ç±»åž‹â€œint”
  ActuatorDemo.vcxproj -> F:\workspace_LSSF\Actuator\Debug\ActuatorDemo.exe
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.obj
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/ActuatorDemo.lastbuildstate
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
Debug|Win32|F:\workspace_LSSF\Actuator\|
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.command.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.read.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/CL.write.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.command.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.read.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.tlog/link.write.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/ActuatorDemo.vcxproj.FileListAbsolute.txt
Actuator_src_2.0.3/ActuatorDemo/Debug/vc142.idb
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Debug/vc142.pdb
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.Build.CppClean.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
f:\workspace_lssf\actuator\actuatordemo\release\vc142.pdb
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.obj
f:\workspace_lssf\actuator\release\actuatordemo.exe
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.ipdb
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.iobj
f:\workspace_lssf\actuator\release\actuatordemo.pdb
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\cl.command.1.tlog
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\cl.read.1.tlog
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\cl.write.1.tlog
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\link.command.1.tlog
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\link.read.1.tlog
f:\workspace_lssf\actuator\actuatordemo\release\actuatordemo.tlog\link.write.1.tlog
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.exe.recipe
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <ProjectOutputs>
    <ProjectOutput>
      <FullPath>F:\workspace_LSSF\Actuator\Release\ActuatorDemo.exe</FullPath>
    </ProjectOutput>
  </ProjectOutputs>
  <ContentFiles />
  <SatelliteDlls />
  <NonRecipeFileRefs />
</Project>
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.iobj
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.ipdb
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
  ActuatorDemo.cpp
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(81,40): warning C4244: â€œ=”: ä»Žâ€œdouble”转换到“unsigned short”,可能丢失数据
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(82,52): warning C4244: â€œ=”: ä»Žâ€œdouble”转换到“unsigned short”,可能丢失数据
F:\workspace_LSSF\Actuator\ActuatorDemo\ActuatorDemo.cpp(84,28): warning C4477: â€œprintf”: æ ¼å¼å­—符串“%f”需要类型“double”的参数,但可变参数 2 æ‹¥æœ‰äº†ç±»åž‹â€œint”
  æ­£åœ¨ç”Ÿæˆä»£ç 
  Previous IPDB not found, fall back to full compilation.
  All 22 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
  å·²å®Œæˆä»£ç çš„生成
  ActuatorDemo.vcxproj -> F:\workspace_LSSF\Actuator\Release\ActuatorDemo.exe
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.obj
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/ActuatorDemo.lastbuildstate
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
Release|Win32|F:\workspace_LSSF\Actuator\|
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.command.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.read.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/CL.write.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.command.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.read.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.tlog/link.write.1.tlog
Binary files differ
Actuator_src_2.0.3/ActuatorDemo/Release/ActuatorDemo.vcxproj.FileListAbsolute.txt
Actuator_src_2.0.3/ActuatorDemo/Release/vc142.pdb
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.Build.CppClean.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
f:\workspace_lssf\actuator\debug\actuator.lib
f:\workspace_lssf\actuator\debug\actuator.exp
f:\workspace_lssf\actuator\actuator\debug\actuator.pch
f:\workspace_lssf\actuator\actuator\debug\vc142.pdb
f:\workspace_lssf\actuator\actuator\debug\vc142.idb
f:\workspace_lssf\actuator\actuator\debug\pch.obj
f:\workspace_lssf\actuator\actuator\debug\dllmain.obj
f:\workspace_lssf\actuator\actuator\debug\actuator.obj
f:\workspace_lssf\actuator\actuator\debug\actuator.ilk
f:\workspace_lssf\actuator\debug\actuator.dll
f:\workspace_lssf\actuator\debug\actuator.pdb
f:\workspace_lssf\actuator\actuator\debug\actuator.res
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\actuator.write.1u.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\cl.command.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\cl.read.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\cl.write.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\link.command.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\link.read.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\link.write.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\rc.command.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\rc.read.1.tlog
f:\workspace_lssf\actuator\actuator\debug\actuator.tlog\rc.write.1.tlog
Actuator_src_2.0.3/Debug/Actuator.dll
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.dll.recipe
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <ProjectOutputs>
    <ProjectOutput>
      <FullPath>F:\workspace_LSSF\Actuator\Debug\Actuator.dll</FullPath>
    </ProjectOutput>
  </ProjectOutputs>
  <ContentFiles />
  <SatelliteDlls />
  <NonRecipeFileRefs />
</Project>
Actuator_src_2.0.3/Debug/Actuator.ilk
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
  pch.cpp
  Actuator.cpp
  dllmain.cpp
  æ­£åœ¨ç”Ÿæˆä»£ç ...
    æ­£åœ¨åˆ›å»ºåº“ F:\workspace_LSSF\Actuator\Debug\Actuator.lib å’Œå¯¹è±¡ F:\workspace_LSSF\Actuator\Debug\Actuator.exp
LINK : warning LNK4098: é»˜è®¤åº““LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
  Actuator.vcxproj -> F:\workspace_LSSF\Actuator\Debug\Actuator.dll
Actuator_src_2.0.3/Debug/Actuator.obj
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.pch
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.res
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/Actuator.lastbuildstate
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
Debug|Win32|F:\workspace_LSSF\Actuator\|
Actuator_src_2.0.3/Debug/Actuator.tlog/Actuator.write.1u.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/CL.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/link.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/link.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/link.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.tlog/rc.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Debug/Actuator.vcxproj.FileListAbsolute.txt
Actuator_src_2.0.3/Debug/dllmain.obj
Binary files differ
Actuator_src_2.0.3/Debug/pch.obj
Binary files differ
Actuator_src_2.0.3/Debug/vc142.idb
Binary files differ
Actuator_src_2.0.3/Debug/vc142.pdb
Binary files differ
Actuator_src_2.0.3/Release/Actuator v2.03.dll
Binary files differ
Actuator_src_2.0.3/Release/Actuator.Build.CppClean.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
f:\workspace_lssf\actuator\release\actuator.lib
f:\workspace_lssf\actuator\release\actuator.exp
f:\workspace_lssf\actuator\actuator\release\actuator.pch
f:\workspace_lssf\actuator\actuator\release\vc142.pdb
f:\workspace_lssf\actuator\actuator\release\pch.obj
f:\workspace_lssf\actuator\actuator\release\dllmain.obj
f:\workspace_lssf\actuator\actuator\release\actuator.obj
f:\workspace_lssf\actuator\release\actuator.dll
f:\workspace_lssf\actuator\actuator\release\actuator.ipdb
f:\workspace_lssf\actuator\actuator\release\actuator.iobj
f:\workspace_lssf\actuator\release\actuator.pdb
f:\workspace_lssf\actuator\actuator\release\actuator.res
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\actuator.write.1u.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\cl.command.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\cl.read.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\cl.write.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\link.command.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\link.read.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\link.write.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\rc.command.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\rc.read.1.tlog
f:\workspace_lssf\actuator\actuator\release\actuator.tlog\rc.write.1.tlog
Actuator_src_2.0.3/Release/Actuator.dll
Binary files differ
Actuator_src_2.0.3/Release/Actuator.dll.recipe
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <ProjectOutputs>
    <ProjectOutput>
      <FullPath>F:\workspace_LSSF\Actuator\Release\Actuator.dll</FullPath>
    </ProjectOutput>
  </ProjectOutputs>
  <ContentFiles />
  <SatelliteDlls />
  <NonRecipeFileRefs />
</Project>
Actuator_src_2.0.3/Release/Actuator.exp
Binary files differ
Actuator_src_2.0.3/Release/Actuator.iobj
Binary files differ
Actuator_src_2.0.3/Release/Actuator.ipdb
Binary files differ
Actuator_src_2.0.3/Release/Actuator.lib
Binary files differ
Actuator_src_2.0.3/Release/Actuator.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
  pch.cpp
  Actuator.cpp
  dllmain.cpp
    æ­£åœ¨åˆ›å»ºåº“ F:\workspace_LSSF\Actuator\Release\Actuator.lib å’Œå¯¹è±¡ F:\workspace_LSSF\Actuator\Release\Actuator.exp
  Previous IPDB not found, fall back to full compilation.
LINK : warning LNK4098: é»˜è®¤åº““LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
  æ­£åœ¨ç”Ÿæˆä»£ç 
  All 20 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
  å·²å®Œæˆä»£ç çš„生成
  Actuator.vcxproj -> F:\workspace_LSSF\Actuator\Release\Actuator.dll
Actuator_src_2.0.3/Release/Actuator.obj
Binary files differ
Actuator_src_2.0.3/Release/Actuator.pch
Binary files differ
Actuator_src_2.0.3/Release/Actuator.pdb
Binary files differ
Actuator_src_2.0.3/Release/Actuator.res
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/Actuator.lastbuildstate
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:TargetPlatformVersion=10.0.19041.0:
Release|Win32|F:\workspace_LSSF\Actuator\|
Actuator_src_2.0.3/Release/Actuator.tlog/Actuator.write.1u.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/CL.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/CL.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/CL.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/link.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/link.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/link.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/rc.command.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/rc.read.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.tlog/rc.write.1.tlog
Binary files differ
Actuator_src_2.0.3/Release/Actuator.vcxproj.FileListAbsolute.txt
Actuator_src_2.0.3/Release/ActuatorDemo.pdb
Binary files differ
Actuator_src_2.0.3/Release/dllmain.obj
Binary files differ
Actuator_src_2.0.3/Release/pch.obj
Binary files differ
Actuator_src_2.0.3/Release/vc142.pdb
Binary files differ
bin/GMMSoft.exe
Binary files differ
bin/OpenTabTip.exe
Binary files differ
bin/config/config.db
Binary files differ
bin/config/conn.db
Binary files differ
bin/config/grain.db
Binary files differ
bin/config/log4me.ini
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
#配置文件和主程序在同一目录.没有这个文件或不在主目录中则不写日志
[log4me]
#path,日志的存放目录.必须是主程序目录及子目录.
path=log
#level,日志等级:error,info,debug
#为error时,只有log4error打印的日志被输出.
#为info时,log4error和log4info打印的日志被输出.
#为debug时,log4error,log4info,log4debug打印的日志都被输出.
level=debug
bin/config/manager.db
Binary files differ
bin/config/weight.db
Binary files differ
bin/core/Actuator.dll
Binary files differ
bin/core/Actuator.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,251 @@
// ä¸‹åˆ— ifdef å—是创建使从 DLL å¯¼å‡ºæ›´ç®€å•çš„
// å®çš„æ ‡å‡†æ–¹æ³•。此 DLL ä¸­çš„æ‰€æœ‰æ–‡ä»¶éƒ½æ˜¯ç”¨å‘½ä»¤è¡Œä¸Šå®šä¹‰çš„ ACTUATOR_EXPORTS
// ç¬¦å·ç¼–译的。在使用此 DLL çš„
// ä»»ä½•项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ACTUATOR_API å‡½æ•°è§†ä¸ºæ˜¯ä»Ž DLL å¯¼å…¥çš„,而此 DLL åˆ™å°†ç”¨æ­¤å®å®šä¹‰çš„
// ç¬¦å·è§†ä¸ºæ˜¯è¢«å¯¼å‡ºçš„。
#ifdef ACTUATOR_EXPORTS
#define ACTUATOR_API __declspec(dllexport)
#else
#define ACTUATOR_API __declspec(dllimport)
#endif
typedef enum
{
    //粮种准备命令代码(粮种已修改)
    READY_GRAIN = 0x01,
    //返回准备完成
    READY_FINISH = 0x02,
    //检测启动命令
    DETECT_START = 0x03,
    //返回检测完毕
    DETECT_FINISH = 0x04,
    //设备水分仪复位命令
    DEVICE_WR_RESET = 0xFE,
    //返回水分仪故障代码
    DEVICE_WR_FAULT = 0xFF
}PLCWORD;
typedef enum
{
    //水分仪准备指令
    WR_READY = 0x01,
    //水分仪检测指令
    WR_DETECT = 0x02,
    //水分仪校验指令
    WR_VERIFY = 0x03,
    //水分仪复位指令
    WR_RESET = 0x04,
    //粮食变更指令
    WR_GOODS = 0x05,
    //上阀门开
    WR_VALV01 = 0x07,
    //上阀门关
    WR_VALV02 = 0x08,
    //下阀门开
    WR_VALV03 = 0x09,
    //下阀门关
    WR_VALV04 = 0x0A,
    //双阀门开
    WR_VALV05 = 0x0B,
    //双阀门关
    WR_VALV06 = 0x0C,
    //振动开
    WR_VIBRATE_01 = 0x0D,
    //振动关
    WR_VIBRATE_02 = 0x0E,
}WRWORD;
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   ç½‘络端口
ACTUATOR_API void* __stdcall CreatePlcDevice(const char* strIp, int nPort);
//创建水分仪句柄ctx
//szSerialPort:   ä¸²å£å
//baud:       æ³¢ç‰¹çއ
//parity:     æ ¡éªŒç±»åž‹
//data_bit:   æ•°æ®ä½
//stop_bit:   åœæ­¢ä½
ACTUATOR_API void* __stdcall CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
//连接客户设备或水分仪装置
//ctxDev : è®¾å¤‡å¥æŸ„
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ConnectDevice(void* ctxDev);
//获取状态或粮种更改信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x03:  å¼€å§‹æµ‹è¯•
//         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
//         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
//写回状态
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x02:  å‡†å¤‡å·²å®Œæˆ
//         0x04:  æ£€æµ‹å®Œæˆ
//         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState);
//回传检测数据
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç²®ç§ç¼–码
//         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
//         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
//nSize  : æ•°æ®ä¸ªæ•°
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
//下发命令信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nCmdType ï¼šå‘½ä»¤å­—,如下描述
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x02:  å¼€å§‹æµ‹è¯•
//         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
// nResponseSeconds: å“åº”时间,以秒计算
// nResponseUSeconds: å“åº”时间,以微妙计算,若小于秒,全部用微妙表示。
//返回值:大于0 è¡¨ç¤º è®¾å¤‡æœ‰æ•…障,故障码详见ReadFaultCode函数,有描述
//        å°äºŽ0 è¡¨ç¤º å‘½ä»¤æ‰§è¡Œé”™è¯¯ï¼Œé”™è¯¯å¯ä»¥é€šè¿‡ GetError提取处理。
//        ç­‰äºŽ0 è¡¨ç¤º å‘½ä»¤æ‰§è¡ŒæˆåŠŸ
ACTUATOR_API int __stdcall SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
//下发参数
//ctxDev : è®¾å¤‡å¥æŸ„
//nStartFreq ï¼šèµ·å§‹é¢‘率
//nStopFreq ï¼š ç»ˆæ­¢é¢‘率
//nStepFreq ï¼š æ­¥é•¿
//nDecayCode ï¼šè¡°å‡ç 
//nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
                            unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
//读取检测信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç”µåދ值
//         é‡é‡
//         æ¸©åº¦
//         æ¹¿åº¦
// nSize : è¯»å–4个寄存器
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
//读取固件版本
//ctxDev : è®¾å¤‡å¥æŸ„
//nVersions ï¼šæ•°ç»„,数据顺序如下
//         ç¡¬ä»¶ç‰ˆæœ¬
//         è½¯ä»¶ç‰ˆæœ¬
// nSize : è¯»å–2个寄存器
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadVersion(void* ctxDev, unsigned short* nVersions, unsigned short nSize = 1);
//读取扫频值,其实为电平值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nVcc :   ç”µå¹³å€¼æŒ‡é’ˆ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadVcc(void* ctxDev, unsigned short* nVcc);
//读重量值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nWeight : é‡é‡å€¼
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadWeight(void* ctxDev, unsigned short* nWeight);
//读取故障码,
//ctxDev : è®¾å¤‡å¥æŸ„
//nFaultCode : æ•…障码
//             0 .......... æ­£å¸¸
//             1 .......... ä¸Šé˜€é—¨å…³å¡ä½
//             2 .......... ä¸‹é˜€é—¨å…³å¡ä½
//             4 .......... ä¸Šé˜€é—¨å¼€å¡ä½
//             8 .......... ä¸‹é˜€é—¨å¼€å¡ä½
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall ReadFaultCode(void* ctxDev, unsigned short* nFaultCode);
//复位命令
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:无,
ACTUATOR_API int __stdcall ResetCommand(void* ctxDev);
//取错误字符串:
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:无,
//执行条件,在上面命令函数执行返回-1的时候调用。
ACTUATOR_API const char* __stdcall GetError(void* ctxDev);
//断开水分仪或客户设备的连接
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall Disconnect(void* ctxDev);
//销毁资源
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall DestroyDevice(void* ctxDev);
/***************************轮廓线回传函数**********************************
data:    æ•°æ®ä»¥æ•´æ•°æ•°ç»„表示
nsize:   æ•°æ®å°ºå¯¸
**************************************************************************/
typedef void(__stdcall* MESSAGE_HANDLER)(unsigned short *data, int nsize);
/*
nSlavePort: æœåŠ¡ç«¯å£  æ¯”如 502
szDevPort: ä¸²å£  COM1
baud, parity, data_bit, stop_bit å‚考上面函数
detectTimeout æ£€æµ‹è¶…æ—¶æ—¶é—´
resetTimeout æœåŠ¡è¶…æ—¶æ—¶é—´
handler ï¼š å›žè°ƒå‡½æ•°
*/
ACTUATOR_API int __stdcall StartTcpSlaveEx(void* waterDev, int nSlavePort, int detectTimeout = 60, int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
ACTUATOR_API int __stdcall StartTcpSlave(int nSlavePort, const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit, int, int detectTimeout = 60, int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
ACTUATOR_API int __stdcall StopTcpSlave();
//算法函数
//x ä¸ºæµ‹é‡å€¼
//y ä¸ºå®žé™…值
//n ä¸ºæ‹Ÿåˆæ¬¡æ•°
//nSampleNumber æ ·æœ¬æ•°é‡
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int __stdcall Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
ACTUATOR_API int __stdcall LinearizeX(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
ACTUATOR_API int __stdcall PolyNomialFit(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
//计算函数
ACTUATOR_API double __stdcall CalcValue(unsigned short nDValue, double Coef0, double Coef1, double Coef2, double Coef3, double Coef4);
bin/core/ActuatorDemo.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,429 @@
// ActuatorDemo.cpp : æ­¤æ–‡ä»¶åŒ…含 "main" å‡½æ•°ã€‚程序执行将在此处开始并结束。
//
#include <iostream>
#include <thread>
#include <windows.h>
#include "../Actuator//Actuator.h"
/******************* ä¸ºPLC自动监测准备相关全部变量******************************** */
static bool plcScan = true;
static bool devRunning = false;
/*************************************************************************************
**************************************************************************************/
//系数
const double coef[5] = { -6.204673384923,0.025161776479,-0.000014765722,0.000000003440,0 };
const char sPortName[] = "COM6";
//手动写粮食品种
void ManReady()
{
    if (devRunning){printf("水分仪忙!"); return;}
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
         int ret = ConnectDevice(hWrDev);
         if (ret >= 0)
         {
             ret = SendCommands(hWrDev, WR_READY, 0x01, 0, 500000); //下发确认
             if (ret <= 0)
                 printf("准备失败!\n");
             else
             {
                 printf("准备就绪,OK!\n");
             }
         }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
//手动检测
void ManTest()
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        if (ret >= 0)
        {
            ret = SendCommands(hWrDev, WR_DETECT, 0, 60, 0); //执行启动命令
            if (ret <= 0)
            {
                printf("执行检测失败!\n");
            }
            else
            {
                unsigned short nDatas[10] = { 0 };
                //从水分仪器读取数据
                ret = ReadDatas(hWrDev, nDatas);
                //第一个值为电平值,用来计算水分率
                double v = coef[0] +
                    coef[1] * nDatas[0] +
                    coef[2] * nDatas[0] * nDatas[0] +
                    coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                    coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                v = CalcValue(nDatas[0], coef[0], coef[1], coef[2], coef[3], coef[4]);
                printf(" After Detection,");
                printf(" %d %d %d %d", nDatas[0], nDatas[1], nDatas[2], nDatas[3]);
                printf(" Water Rate:%lf", v);
                printf(" \n");
                printf("检测执行OK!\n");
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
//手动复位
void ManReset()
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        if (ret >= 0)
        {
            ret = SendCommands(hWrDev, WR_RESET, 0, 15, 0); //下发复位
            if (ret <= 0)
            {
                printf("复位失败!\n");
            }
            else
            {
                printf("复位成功!\n");
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
void GetWeight()
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        unsigned short nWeight = 0;
        if (ret >= 0)
        {
            //从水分仪器读取数据
            ret = ReadWeight(hWrDev, &nWeight);
            if (ret >= 0)
            {
                printf(" Weight Val: %d", nWeight);
                printf(" \n");
                printf("称重执行OK!\n");
            }
            else
            {
                printf("称重执行失败!\n");
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
void CurrVersion()
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        //unsigned char nVersions[2] = { 0 };
        unsigned short nVersions;
        if (ret >= 0)
        {
            //从水分仪器读取数据
            ret = ReadVersion(hWrDev, &nVersions);
            if (ret >= 0)
            {
                printf(" Version1 Val: %d", nVersions & 0x00FF);
                printf(" \n");
                printf(" Version2 Val: %d", nVersions >> 8);
                printf(" \n");
            }
            else
            {
                printf("版本执行失败!\n");
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
void ExecPlcReady(void* hPlc, int nGrainType)
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        if (ret >= 0)
        {
            //向水分仪发粮种更改,启动准备
            ret = SendCommands(hWrDev, WR_READY, nGrainType, 0, 500000);
            if (ret < 0)
            {
                printf("粮食品种修改失败!水分仪故障!\n");
                ret = ResponseState(hPlc, DEVICE_WR_FAULT);
            }
            else
            {
                printf("粮食品种修改成功!准备就绪\n");
                ret = ResponseState(hPlc, READY_FINISH);
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
void ExecPlcDetect(void* hPlc, int nTimeout /*以秒计*/)
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev && hPlc)
    {
        int ret = ConnectDevice(hWrDev);
        if (ret >= 0)
        {
            ret = SendCommands(hWrDev, WR_DETECT, 0, nTimeout, 0);
            if (ret <= 0)
            {
                printf("执行检测失败!\n");
                ret = ResponseState(hPlc, DEVICE_WR_FAULT);
            }
            else
            {
                unsigned short nDatas[10] = { 0 };
                unsigned short nSendData[3] = { 0 };
                //从水分仪器读取数据
                ret = ReadDatas(hWrDev, nDatas);
                printf("执行检测成功!\n");
                ret = ResponseState(hPlc, DETECT_FINISH);
                //计算水分率
                double v = coef[0] +
                    coef[1] * nDatas[0] +
                    coef[2] * nDatas[0] * nDatas[0] +
                    coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                    coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                nSendData[0] = 0x01; // ç²®é£Ÿå“ç§
                nSendData[1] = 100 * v; // 21.30% //含水率
                nSendData[2] = 100 * nDatas[1] / 0.52; // 51.50; //容重比
                printf("Get Vals: wr:%f, weight:%f, temperatur:%f, humidity:%f",
                    v,
                    nDatas[1],
                    nDatas[2] / 100.f,
                    nDatas[3] / 100.f);
                ret = UploadData(hPlc, nSendData);
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
void ExecPlcReset(void* hPlc, int nTimeout /*以秒计*/)
{
    if (devRunning) { printf("水分仪忙!"); return; }
    devRunning = true;
    void* hWrDev = CreateWrDevice(sPortName, 115200, 'N', 8, 1);
    if (hWrDev)
    {
        int ret = ConnectDevice(hWrDev);
        if (ret >= 0)
        {
            //向水分仪发粮种更改,启动准备
            ret = SendCommands(hWrDev, WR_RESET, 0, nTimeout, 0);
            if (ret <= 0)
            {
                printf("复位失败!\n");
                ret = ResponseState(hPlc, DEVICE_WR_FAULT);
            }
            else
            {
                printf("复位成功!\n");
            }
        }
        Disconnect(hWrDev);
        DestroyDevice(hWrDev);
    }
    devRunning = false;
}
static void ExecPLCCommand()
{
    unsigned short nPlcCommandState = 0;
    unsigned short nPlcCommandGrainType = 0;
    float fPlcCommandDrift = 0;
    bool ret = -1;
    void* hPlcDev = CreatePlcDevice("127.0.0.1", 1502);
    if (hPlcDev) ret = ConnectDevice(hPlcDev);
    while (plcScan)  //按 c é€€å‡ºè‡ªåŠ¨æ£€æµ‹
    {
        ret = ReadState(hPlcDev, &nPlcCommandState, &nPlcCommandGrainType);
        if (ret <= 0)
        {
            printf("读取PLC状态字异常!\n");
        }
        else
        {
            //读PLC状态字
            if (nPlcCommandGrainType > 0 && nPlcCommandState > 0)
            {
                //下面是主流程的处理
                switch (nPlcCommandState)
                {
                case READY_GRAIN: //粮食品种修改了
                    ExecPlcReady(hPlcDev, nPlcCommandGrainType);
                    break;
                case DETECT_START: //开始测试
                    ExecPlcDetect(hPlcDev, 60);
                    break;
                case DEVICE_WR_RESET: //复位命令
                    ExecPlcReset(hPlcDev, 10);
                    break;
                }
            }
        }
        /*一秒读取PLC一次信息*/
        Sleep(1000);
    }
}
int main()
{
    std::cout << "水分仪测试程序已开启!\n";
    char ch = 0;
    while ('x' != ( ch = getchar() )) //按 x é€€å‡ºç¨‹åº
    {
        switch (ch)
        {
            case 'a': //自动测试
                {
                    std::thread workThread = std::thread(ExecPLCCommand);
                    workThread.detach();
                }
                break;
            case 'r': //手动检测,需要准备
                ManReady();
                break;
            case 'd': //手动检测,不许准备
                ManTest();
                break;
            case 'z':  //复位清零
                ManReset();
                break;
            case 'w':
                GetWeight();
                break;
            case 'V':
                CurrVersion();
                break;
            default:
                break;
        }
    }
    return 1;
}
bin/core/ActuatorDemo.exe
Binary files differ
bin/core/sqlite3_x86.dll
Binary files differ
bin/data/data.db
Binary files differ
bin/data/test.db
Binary files differ
bin/log/20250704.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
2025-07-04 08:22:24 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:22:24 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:22:24 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:22:24 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:22:24 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:22:24 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:22:24 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:22:24 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:22:26 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:22:26 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:22:28 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:22:28 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:25:46 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:25:46 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:25:46 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:25:46 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:25:46 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:25:46 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:25:46 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:25:46 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:25:48 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:25:48 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:25:57 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:25:57 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:26:32 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:26:32 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:26:32 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:26:32 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:26:32 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:26:32 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:26:32 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:26:32 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:26:33 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:26:33 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:26:41 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:26:41 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:26:53 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:26:53 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:26:53 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:26:53 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:26:53 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:26:53 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:26:53 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:26:53 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:26:54 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:26:54 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:27:01 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:27:01 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:27:17 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:27:17 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:27:17 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:27:17 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:27:17 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:27:17 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:27:17 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:27:17 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:27:18 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:27:18 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:29:16 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:29:16 [info ]log4me: æ—¥å¿—系统停止.
.
2025-07-04 08:27:23 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:27:23 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:27:23 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:27:23 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:27:23 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:27:23 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:27:24 [error]错误:水分仪连接失败, è¿”回值=[-1].
2025-07-04 08:27:24 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:29:15 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:29:15 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:30:40 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:30:40 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:30:40 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:30:40 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:30:40 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:30:40 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:30:40 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:30:40 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:30:41 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:30:41 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:31:05 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:31:05 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:34:47 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:34:48 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:34:48 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:34:48 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:34:48 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:34:48 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:34:48 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:34:48 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:34:49 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:34:49 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:34:57 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:34:57 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:36:24 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:36:24 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:36:24 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:36:24 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:36:24 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:36:24 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:36:24 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:36:24 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:36:25 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:36:25 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:36:35 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:36:35 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:40:05 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:40:05 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:40:05 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:40:05 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:40:05 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:40:05 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:40:05 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:40:05 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:40:07 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:40:07 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:40:31 [info ]模式:手动检测模式,停止 TestThread()线程,准备手动操作!
2025-07-04 08:41:02 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:41:02 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:41:48 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:41:48 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:41:48 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:41:48 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:41:48 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:41:48 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:41:48 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:41:48 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:41:49 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:41:49 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:41:54 [info ]模式:手动检测模式,停止 TestThread()线程,准备手动操作!
2025-07-04 08:41:59 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:41:59 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:42:46 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:42:46 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:42:46 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:42:46 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:42:46 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:42:46 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:42:46 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:42:46 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:42:47 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:42:47 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:42:57 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:42:57 [info ]log4me: æ—¥å¿—系统停止.
2025-07-04 08:43:45 [info ]log4me: æ—¥å¿—系统启动.
2025-07-04 08:43:45 [info ]系统:初始化创建 data-存储数据库.
2025-07-04 08:43:45 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-04 08:43:45 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-04 08:43:45 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-04 08:43:45 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-04 08:43:45 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-04 08:43:45 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-04 08:43:46 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-04 08:43:46 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-04 08:44:46 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-04 08:44:46 [info ]log4me: æ—¥å¿—系统停止.
bin/log/20250707.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
2025-07-07 08:46:42 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:46:42 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:46:42 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:46:42 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:46:42 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:46:42 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:46:42 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:46:42 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:46:43 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:46:43 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:46:47 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:46:47 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:47:11 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:47:11 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:47:11 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:47:11 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:47:11 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:47:11 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:47:11 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:47:11 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:47:13 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:47:13 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:47:18 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:47:18 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:49:25 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:49:25 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:49:25 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:49:25 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:49:25 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:49:25 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:49:25 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:49:27 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:49:27 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:49:30 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:49:30 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:51:42 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:51:42 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:51:42 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:51:42 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:51:42 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:51:42 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:51:42 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:51:42 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:51:43 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:51:43 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:51:46 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:51:46 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:53:59 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:53:59 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:53:59 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:53:59 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:53:59 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:53:59 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:53:59 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:53:59 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:54:01 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:54:01 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:54:09 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:54:09 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:54:22 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:54:22 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:54:22 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:54:22 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:54:22 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:54:22 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:54:22 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:54:22 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:54:23 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:54:23 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:54:29 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:54:29 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:54:41 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:54:41 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:54:41 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:54:41 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:54:41 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:54:41 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:54:41 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:54:41 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:54:42 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:54:42 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:54:46 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:54:46 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:55:22 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:55:22 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:55:22 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:55:22 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:55:22 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:55:22 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:55:22 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:55:22 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:55:24 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:55:24 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:55:27 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:55:27 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 08:56:29 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 08:56:29 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 08:56:29 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 08:56:29 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 08:56:29 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 08:56:29 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 08:56:29 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 08:56:29 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 08:56:30 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 08:56:30 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 08:56:43 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 08:56:43 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 09:17:16 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 09:17:17 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 09:17:17 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 09:17:17 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 09:17:17 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 09:17:17 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 09:17:17 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 09:17:17 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 09:17:18 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 09:17:18 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 09:17:45 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 09:17:45 [info ]log4me: æ—¥å¿—系统停止.
2025-07-07 09:29:23 [info ]log4me: æ—¥å¿—系统启动.
2025-07-07 09:29:23 [info ]系统:初始化创建 data-存储数据库.
2025-07-07 09:29:23 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-07 09:29:23 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-07 09:29:23 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-07 09:29:23 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-07 09:29:23 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-07 09:29:23 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-07 09:29:24 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-07 09:29:24 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-07 09:29:36 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-07 09:29:36 [info ]log4me: æ—¥å¿—系统停止.
bin/log/20250708.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
2025-07-08 07:46:33 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 07:46:33 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 07:46:33 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 07:46:33 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 07:46:33 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 07:46:33 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 07:46:33 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 07:46:33 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 07:46:34 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 07:46:34 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 07:46:40 [info ]模式:手动检测模式,停止 TestThread()线程,准备手动操作!
2025-07-08 07:47:08 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 07:47:08 [info ]log4me: æ—¥å¿—系统停止.
2025-07-08 07:50:20 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 07:50:20 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 07:50:20 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 07:50:20 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 07:50:20 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 07:50:20 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 07:50:20 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 07:50:20 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 07:50:21 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 07:50:21 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 07:50:39 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 07:50:39 [info ]log4me: æ—¥å¿—系统停止.
2025-07-08 07:50:57 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 07:50:57 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 07:50:57 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 07:50:57 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 07:50:57 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 07:50:57 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 07:50:57 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 07:50:57 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 07:50:58 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 07:50:58 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 07:51:20 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 07:51:20 [info ]log4me: æ—¥å¿—系统停止.
2025-07-08 07:57:04 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 07:57:04 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 07:57:04 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 07:57:04 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 07:57:04 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 07:57:04 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 07:57:04 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 07:57:04 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 07:57:05 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 07:57:05 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 07:57:35 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 07:57:35 [info ]log4me: æ—¥å¿—系统停止.
2025-07-08 09:05:26 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 09:05:27 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 09:05:27 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 09:05:27 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 09:05:27 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 09:05:27 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 09:05:27 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 09:05:27 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 09:05:28 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 09:05:28 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 09:05:31 [info ]模式:手动检测模式,停止 TestThread()线程,准备手动操作!
2025-07-08 09:06:27 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 09:06:27 [info ]log4me: æ—¥å¿—系统停止.
2025-07-08 10:33:06 [info ]log4me: æ—¥å¿—系统启动.
2025-07-08 10:33:06 [info ]系统:初始化创建 data-存储数据库.
2025-07-08 10:33:06 [info ]系统:载入 config-系统参数 (设备参数).
2025-07-08 10:33:06 [info ]系统:载入 conn-系统参数 (扦捡系统、水分仪、存储参数).
2025-07-08 10:33:06 [info ]系统:载入 grain-粮种参数 (粮种代码、名称、校准系数).
2025-07-08 10:33:06 [info ]系统:载入 weight-系统参数 (y=kx+b).
2025-07-08 10:33:06 [info ]系统:载入 manager-管理参数 (手动模式口令).
2025-07-08 10:33:06 [info ]屏幕:探测屏幕分辨率为[1920X1200],屏幕类型为[0].
2025-07-08 10:33:07 [info ]连接:水分仪设备连接成功,返回值=[0].
2025-07-08 10:33:07 [info ]模式:自动检测模式,启动 TestThread()线程!
2025-07-08 10:33:10 [info ]模式:手动检测模式,停止 TestThread()线程,准备手动操作!
2025-07-08 10:33:24 [info ]系统:数据库 [grain] æ–°å¢žä¸€æ¡ç²®ç§ä¿¡æ¯.
2025-07-08 10:33:33 [info ]粮种:当前选中[华北], ä»£ç [1], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:33:38 [info ]提示:数据库 [grain] ç²®é£Ÿåç§° [华北1] æ›´æ–°æˆåŠŸ.
2025-07-08 10:33:45 [info ]粮种:当前选中[大豆], ä»£ç [3], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:33:55 [info ]粮种:当前选中[华北1], ä»£ç [1], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:34:05 [info ]粮种:当前选中[粳稻], ä»£ç [5], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:34:09 [info ]系统:数据库 [grain] æ–°å¢žä¸€æ¡ç²®ç§ä¿¡æ¯.
2025-07-08 10:34:17 [info ]粮种:当前选中[南方], ä»£ç [5], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:34:29 [info ]粮种:当前选中[华北1], ä»£ç [1], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:34:30 [info ]提示:成功删除 [小麦-华北1] ç²®ç§ä¿¡æ¯ï¼
2025-07-08 10:35:35 [info ]系统:保存截距参数-[22.6] åˆ° [华北1]粮种信息.
2025-07-08 10:35:35 [info ]粮种:保存 [华北1] ç²®ç§ä¿¡æ¯, ä»£ç -[1], æˆªè·-[22.6]
2025-07-08 10:35:43 [info ]粮种:当前选中[南方], ä»£ç [5], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:35:53 [info ]系统:关闭 æ‰¦æ¡ å’Œæ°´åˆ†ä»ªè®¾å¤‡ï¼
2025-07-08 10:35:53 [info ]粮种:当前选中[粳稻], ä»£ç [5], æ ¡å‡†ç³»æ•°[0,0.01,0,0,0]
2025-07-08 10:35:53 [info ]log4me: æ—¥å¿—系统停止.
bin/modbus_data.bin
Binary files differ
bin/runtime/VS2018ÔËÐÐʱ¿â.exe
Binary files differ
bin/runtime/²¿ÊðÖ¸ÄÏ.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
1. å·¥æŽ§æœºç™»å½•
Administrator/1
2.IP设置
工控机IP:192.168.2.28
调试电脑IP:192.168.2.100
3.部署位置
工控机-->D:\LBGZSoft\bin
4.系统要求
windows7及以上系统
支持X64、X86平台
5.环境依赖
snap7.dll
sqlite3_x64.dll
sqlite3_x86.dll
libeay32.dll
ssleay32.dll
6.部署要求
拷贝运行,第一次安装  VS2018运行时库.exe
bin/ss20250429.csv
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
序号,样本信息,含水率,温度,湿度,日期
1,稻谷,5.12,0.00,0.00,2025-04-29 08:11:04
2,大豆,256.00,0.00,0.00,2025-04-29 08:11:35
3,玉米,5.12,0.00,0.00,2025-04-29 08:12:00
4,大豆,256.00,0.00,0.00,2025-04-29 11:07:18
5,稻谷,5.12,0.00,0.00,2025-04-29 11:07:44
6,小麦,0.00,0.00,0.00,2025-04-29 12:33:22
7,稻谷,5.12,0.00,0.00,2025-04-29 12:55:03
8,玉米,5.12,0.00,0.00,2025-04-29 12:55:13
9,大豆,256.00,0.00,0.00,2025-04-29 12:55:21
10,小麦,5.12,0.00,0.00,2025-04-29 12:55:30
11,稻谷,5.12,0.00,0.00,2025-04-29 13:01:25
12,玉米,10.24,0.00,0.00,2025-04-29 13:01:33
13,大豆,15.36,0.00,0.00,2025-04-29 13:01:41
14,小麦,20.48,0.00,0.00,2025-04-29 13:01:47
demo/Keyboard/1.Çå³ý32.bmp
demo/Keyboard/2.È·ÈÏ32.bmp
demo/Keyboard/4.·µ»Ø32.bmp
demo/Keyboard/Keyboard.cfg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"d:\program files\borland\delphi7\Projects\Bpl"
-LN"d:\program files\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
demo/Keyboard/Keyboard.dof
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;dbrtl;vcldb;VclSmp;dbexpress;bdertl;vclie;adortl;vclactnband;vclshlctrls;dclOfficeXP;vcldbx;visualclx;visualdbclx;inet;xmlrtl;inetdbbde;inetdbxpress;IndyCore70;IndySystem70;IndyProtocols70;RaizeComponentsVcl;RaizeComponentsVclDb
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=2052
CodePage=936
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
d:\program files\borland\delphi7\Bin\dclwbm70.bpl=Borland InternetExpress Components
D:\Program Files\Borland\Delphi7\Bin\dcltee70.bpl=TeeChart Components
d:\program files\borland\delphi7\Bin\dcldss70.bpl=Borland Decision Cube Components
d:\program files\borland\delphi7\Bin\DCLIB70.bpl=InterBase Data Access Components
d:\program files\borland\delphi7\Bin\dclmcn70.bpl=Borland DataSnap Connection Components
D:\Program Files\Borland\Delphi7\Bin\dclmid70.bpl=Borland MyBase DataAccess Components
d:\program files\borland\delphi7\Bin\dcldbxcds70.bpl=Borland SimpleDataset Component (DBX)
d:\program files\borland\delphi7\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package
d:\program files\borland\delphi7\Bin\dclsoap70.bpl=Borland SOAP Components
d:\program files\borland\delphi7\Bin\dclwebsnap70.bpl=Borland WebSnap Components
d:\program files\borland\delphi7\Bin\dclite70.bpl=Borland Integrated Translation Environment
C:\WINDOWS\SysWOW64\ibevnt70.bpl=Borland Interbase Event Alerter Component
d:\program files\borland\delphi7\Projects\Bpl\dclfrx7.bpl=FastReport 4.0 Components
d:\program files\borland\delphi7\Bin\dclindy70.bpl=Internet Direct (Indy) for D7 Property and Component Editors
demo/Keyboard/Keyboard.dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
program Keyboard;
uses
  Forms,
  uMain in 'uMain.pas' {frmMain};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.
demo/Keyboard/Keyboard.exe
Binary files differ
demo/Keyboard/Keyboard.res
Binary files differ
demo/Keyboard/kb_icon.ico
demo/Keyboard/uMain.dcu
Binary files differ
demo/Keyboard/uMain.ddp
Binary files differ
demo/Keyboard/uMain.dfm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2297 @@
object frmMain: TfrmMain
  Left = 192
  Top = 131
  Width = 584
  Height = 301
  Caption = #35302#23631#34394#25311#38190#30424
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -21
  Font.Name = #24494#36719#38597#40657
  Font.Style = []
  Icon.Data = {
    000001000700404000000100200028420000760000003030000001002000A825
    00009E4200002828000001002000681A0000466800002020000001002000A810
    0000AE820000181800000100200088090000569300001414000001002000B806
    0000DE9C000010100000010020006804000096A3000028000000400000008000
    0000010020000000000000420000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000555555032424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424073F3F
    3F04000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000003F3F3F042E2E2E2C2B2B2B702B2B2B972B2B
    2BA42C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C
    2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C
    2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C
    2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C
    2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C
    2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52C2C2CA52B2B2BA42B2B
    2B982D2D2D6B2D2D2D2700000003000000000000000000000000000000000000
    00000000000000000000242424072B2B2B5D2B2B2BD82B2B2BFB2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2C2C2CD42B2B2B5D2A2A2A060000000000000000000000000000
    000000000000000000012B2B2B522C2C2CE62C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CE62A2A2A4E0000000100000000000000000000
    000000000000262626142C2C2CBF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BC03030301500000000000000000000
    0000000000002B2B2B3B2C2C2CEC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BEE2D2D2D3D00000000000000000000
    0000000000002B2B2B572C2C2CF72C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CF82C2C2CC52C2C2CA82C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CC42C2C2CF92C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF72D2D2D5500000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2B2B2BC22A2A2A1E1F1F1F082424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    24072424240724242407242424072929291F2C2C2CC42C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA524242407000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA524242407000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA81F1F1F08000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000001F1F1F082C2C2CAB2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CD62D2D2D432F2F2F202929291F2929291F2929291F2929
    291F2929291F2929291F2929291F2929291F2929291F2929291F2929291F2929
    291F2929291F2929291F2929291F2929291F2929291F2929291F2929291F2929
    291F2929291F2929291F2F2F2F202C2C2C452B2B2BD92C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFE2C2C2CEC2C2C2CE02B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2C2C2CE02C2C2CEC2C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFE2C2C2CF92C2C2CF82C2C2CF82C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFD2C2C2CF82C2C2CF82C2C2CF92C2C2CFE2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C2CF82C2C
    2CF82B2B2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFE2C2C2CF92C2C2CF82C2C2CF82C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFD2C2C2CF82C2C2CF82C2C2CF92C2C2CFE2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B
    2BAA2A2A2A602A2A2A5A2C2C2C5B2B2B2B882B2B2BEE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CEC2C2C2C852C2C2C5B2A2A2A5A2A2A2A5F2B2B2BAB2B2B
    2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BCE2A2A2A6C2A2A2A5A2A2A
    2A5A2C2C2C6E2B2B2BD22C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B
    2BAA2A2A2A602A2A2A5A2C2C2C5B2B2B2B882B2B2BEE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CEC2C2C2C852C2C2C5B2A2A2A5A2A2A2A5F2B2B2BAB2B2B
    2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE52D2D
    2D2D0000000000000000000000002424240E2B2B2BB42C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CB12727270D0000000000000000000000002C2C2C2E2C2C
    2CE62C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B2B6A00000001000000000000
    0000000000022B2B2B6A2B2B2BFA2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE52D2D
    2D2D0000000000000000000000002424240E2B2B2BB42C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CB12727270D0000000000000000000000002C2C2C2E2C2C
    2CE62C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE62B2B
    2B2F0000000000000000000000002A2A2A0C2C2C2CB32C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CB22727270D0000000000000000000000002B2B2B2F2C2C
    2CE62C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B2B6A00000001000000000000
    0000000000022C2C2C6E2B2B2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE62B2B
    2B2F0000000000000000000000002A2A2A0C2C2C2CB32C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CB22727270D0000000000000000000000002B2B2B2F2C2C
    2CE62C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C
    2CA82B2B2B5E2B2B2B582A2A2A592C2C2C7F2B2B2BEC2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CED2C2C2C842A2A2A592B2B2B582B2B2B5E2C2C2CA62B2B
    2BFA2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CD02B2B2B6A2B2B2B582B2B
    2B582B2B2B6F2B2B2BD32C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C
    2CA82B2B2B5E2B2B2B582A2A2A592C2C2C7F2B2B2BEC2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CED2C2C2C842A2A2A592B2B2B582B2B2B5E2C2C2CA62B2B
    2BFA2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFE2C2C2CF92C2C2CF82C2C2CF82B2B2BFC2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFC2C2C2CF82C2C2CF82C2C2CF92C2C2CFE2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C2CF82C2C
    2CF82B2B2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFE2C2C2CF92C2C2CF82C2C2CF82B2B2BFC2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFC2C2C2CF82C2C2CF82C2C2CF92C2C2CFE2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF52C2C2CE22C2C2CE02C2C2CE02C2C2CEC2C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFE2C2C2CED2C2C2CE02C2C2CE02C2C2CE22B2B2BF62C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C2CE62C2C2CE02C2C
    2CE02C2C2CE62B2B2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF52C2C2CE22C2C2CE02C2C2CE02C2C2CEC2C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFE2C2C2CED2C2C2CE02C2C2CE02C2C2CE22B2B2BF62C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2B2B2BF42A2A
    2A712A2A2A242F2F2F202F2F2F202C2C2C452B2B2BD82C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CDA2E2E2E482E2E2E212F2F2F202A2A2A242B2B2B752B2B
    2BF52C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B2BA92D2D2D2D2F2F2F202F2F
    2F202B2B2B2F2C2C2CAC2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BF42A2A
    2A712A2A2A242F2F2F202F2F2F202C2C2C452B2B2BD82C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CDA2E2E2E482E2E2E212F2F2F202A2A2A242B2B2B752B2B
    2BF52C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE12B2B
    2B230000000000000000000000001F1F1F082B2B2BAA2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2D2D2DA91F1F1F080000000000000000000000002B2B2B232C2C
    2CE12C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF92D2D2D5F00000000000000000000
    0000000000002A2A2A612C2C2CF92C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE12B2B
    2B230000000000000000000000001F1F1F082B2B2BAA2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2D2D2DA91F1F1F080000000000000000000000002B2B2B232C2C
    2CE12C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002F2F2F202C2C
    2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002D2D2D222C2C
    2CE12C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82A2A2A5900000000000000000000
    0000000000002929295C2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F000000000000000000000000242424072C2C2CA72C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CA5242424070000000000000000000000002D2D2D222C2C
    2CE12C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002A2A2A5A2C2C2CF82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CEC2B2B
    2B471C1C1C0924242407242424072F2F2F202C2C2CC32C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CC22A2A2A1E24242407242424071F1F1F082B2B2B472C2C
    2CEC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFD2B2B2B862727270D242424072424
    24072A2A2A0C2C2C2C842C2C2CFC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CEC2B2B
    2B471C1C1C0924242407242424072F2F2F202C2C2CC32C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CC22A2A2A1E24242407242424071F1F1F082B2B2B472C2C
    2CEC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF82B2B2B5800000000000000000000
    0000000000002B2B2B572C2C2CF72C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2C2C
    2CDC2B2B2BAA2C2C2CA52C2C2CA62C2C2CC52C2C2CF82C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CF92C2C2CC22C2C2CA62C2C2CA52C2C2CA72B2B2BD72C2C
    2CFE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CEC2C2C2CB22C2C2CA52C2C
    2CA52C2C2CB22C2C2CEC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2C2C
    2CDC2B2B2BAA2C2C2CA52C2C2CA62C2C2CC52C2C2CF82C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CF92C2C2CC22C2C2CA62C2C2CA52C2C2CA72B2B2BD72C2C
    2CFE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF72D2D2D5500000000000000000000
    0000000000002B2B2B3B2C2C2CED2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BEE2D2D2D3E00000000000000000000
    0000000000002E2E2E162B2B2BC12C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CBF2E2E2E1600000000000000000000
    000000000000000000012C2C2C502C2C2CE72C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CE62A2A2A540000000200000000000000000000
    000000000000000000002A2A2A062D2D2D602B2B2BD82B2B2BFB2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2BD72A2A2A5F2A2A2A060000000000000000000000000000
    0000000000000000000000000000555555032E2E2E2C2B2B2B6F2B2B2B992C2C
    2CA62C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C
    2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA72C2C2CA62C2C
    2C9A2C2C2C6D2C2C2C283F3F3F04000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000555555032424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424072424
    2407242424072424240724242407242424072424240724242407242424073F3F
    3F04000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000FFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00
    00000000007FF00000000000000FE000000000000007C000000000000003C000
    000000000003C000000000000003C000000000000003C000000000000003C000
    0FFFFFF00003C0000FFFFFF00003C0000FFFFFF00003C000000000000003C000
    000000000003C000000000000003C000000000000003C000000000000003C000
    000000000003C000000000000003C0700E0180700E03C0700E03C0700E03C070
    0E03C0700E03C0700E0180700E03C000000000000003C000000000000003C000
    000000000003C000000000000003C000000000000003C000000000000003C000
    000000000003C0700E03C0700E03C0700E03C0700E03C0700E03C0700E03C000
    000000000003C000000000000003C000000000000003C000000000000003C000
    000000000003E000000000000007F00000000000000FFE0000000000003FFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2800
    0000300000006000000001002000000000008025000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000001C1C1C09282828192D2D
    2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D
    2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D
    2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D
    2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D
    2D222D2D2D222D2D2D222D2D2D22282828191F1F1F0800000000000000000000
    0000000000000000000000000000000000022C2C2C392C2C2CA62C2C2CD42B2B
    2BDD2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2C2C2CD42A2A2AA12A2A2A36000000020000
    00000000000000000000000000002D2D2D382C2C2CD52C2C2CFE2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2C2C2CD52B2B2B350000
    00000000000000000000242424072C2C2CA12C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B2BA31F1F
    1F0800000000000000003131311A2B2B2BD42C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2C2C2CE02C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CD42727
    271A00000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2A2A2A242B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232A2A2A242C2C2C5B2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D22000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D22000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000002A2A2A242C2C2CE02C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CED2B2B
    2B57272727202929291F2929291F2929291F2929291F2929291F2929291F2929
    291F2929291F2929291F2929291F2929291F2929291F2929291F2929291F2929
    291F2929291F272727202A2A2A592B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BEE2B2B2BDF2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDF2B2B2BEE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDE2B2B2BDE2B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDD2B2B2BDD2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BEE2B2B2BDD2B2B2BDE2B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDE2B2B2BDE2B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDD2B2B2BDD2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A5A2D2D2D222D2D2D222B2B2B5D2C2C2CEF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2D2D2D222D2D2D222C2C2C5B2C2C2CF02C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592D2D2D222D2D2D222C2C2C5B2B2B2BEE2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A5A2D2D2D222D2D2D222B2B2B5D2C2C2CEF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2D2D2D222D2D2D222C2C2C5B2C2C2CF02C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CDF2929
    291F00000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE02C2C2CFF2C2C2CFF2B2B2BDD2626
    262100000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2B2B2BDE2929
    291F00000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE02C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CE02727
    272000000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE12C2C2CFF2C2C2CFF2C2C2CDC2626
    262100000000000000002D2D2D222B2B2BDE2C2C2CFF2C2C2CFF2B2B2BDF2727
    272000000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE12C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A592E2E2E212F2F2F202B2B2B582C2C2CEF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2E2E2E212E2E2E212D2D2D592B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592E2E2E212E2E2E212C2C2C5C2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A592E2E2E212F2F2F202B2B2B582C2C2CEF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2E2E2E212E2E2E212D2D2D592B2B2BEF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDD2C2C2CDC2C2C2CED2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2C2C2CDC2C2C2CDC2B2B2BEE2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2C2C2CDC2B2B2BDD2B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2B2B2BDD2C2C2CDC2C2C2CED2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2C2C2CDC2C2C2CDC2B2B2BEE2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BEF2C2C2CE12C2C2CE02B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2C2C2CE12C2C2CE12B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2C2C2CE02C2C2CE12B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BEF2C2C2CE12C2C2CE02B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEF2C2C2CE12C2C2CE12B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592D2D2D222E2E2E212A2A2A5A2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEF2C2C
    2C5B2D2D2D222D2D2D222C2C2C5C2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEE2D2D
    2D5A2E2E2E212D2D2D222C2C2C5B2B2B2BF02C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592D2D2D222E2E2E212A2A2A5A2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEF2C2C
    2C5B2D2D2D222D2D2D222C2C2C5C2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CDF2727
    272000000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDF2B2B
    2B2300000000000000002E2E2E212C2C2CE02C2C2CFF2C2C2CFF2B2B2BDD2626
    262100000000000000002D2D2D222B2B2BDE2C2C2CFF2C2C2CFF2B2B2BDE2727
    272000000000000000002B2B2B232C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDF2B2B
    2B2300000000000000002E2E2E212C2C2CE02C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2C2C2CDF2727
    272000000000000000002A2A2A242C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE12C2C2CFF2C2C2CFF2B2B2BDD2626
    262100000000000000002D2D2D222B2B2BDE2C2C2CFF2C2C2CFF2B2B2BDE2727
    272000000000000000002A2A2A242C2C2CDF2C2C2CFF2C2C2CFF2B2B2BDE2D2D
    2D2200000000000000002D2D2D222C2C2CE12C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000002E2E2E212B2B2BDD2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A5B2B2B2B232B2B2B232C2C2C5B2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592B2B2B232B2B2B232D2D2D5A2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEF2A2A
    2A5A2B2B2B232B2B2B232A2A2A5A2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A5B2B2B2B232B2B2B232C2C2C5B2B2B2BEF2C2C2CFF2C2C2CFF2B2B2BEE2A2A
    2A592B2B2B232B2B2B232D2D2D5A2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CDC2727
    272000000000000000003131311A2C2C2CD52C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF02B2B2BDF2B2B2BDF2B2B2BEF2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2B2B2BDE2B2B2BDE2B2B2BEE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2B2B2BDF2B2B2BDE2B2B2BEF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF02B2B2BDF2B2B2BDF2B2B2BEF2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BEE2B2B2BDE2B2B2BDE2B2B2BEE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CD42727
    271A00000000000000001F1F1F082B2B2BA42C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B2BA33F3F
    3F080000000000000000000000002E2E2E372B2B2BD72C2C2CFE2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2C2C2CD62C2C2C390000
    0000000000000000000000000000000000022C2C2C392C2C2CA62C2C2CD52B2B
    2BDE2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C2CDF2C2C
    2CDF2C2C2CDF2C2C2CDF2B2B2BDF2C2C2CD52B2B2BA32C2C2C39000000020000
    00000000000000000000000000000000000000000000383838092727271A2B2B
    2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
    2B232B2B2B232B2B2B232B2B2B232F2F2F1B1F1F1F0800000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF
    FFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF
    FFFFFFFF0000FFFFFFFFFFFF0000F0000000000F0000C000000000030000C000
    0000000300008000000000010000800000000001000080000000000100008001
    FFFF800100008001FFFF80010000800000000001000080000000000100008000
    0000000100008000000000010000800000000001000080000000000100008181
    8181818100008181818181810000800000000001000080000000000100008000
    0000000100008000000000010000800000000001000080000000000100008181
    8181818100008181818181810000800000000001000080000000000100008000
    000000010000C000000000030000C000000000030000F0000000000F0000FFFF
    FFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF
    FFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF
    FFFFFFFF00002800000028000000500000000100200000000000401A00000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0002333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305000000020000
    000000000000000000000000000000000000000000003333330A2B2B2B532C2C
    2C952C2C2CA52C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C
    2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C
    2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C
    2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA52C2C2C942D2D
    2D4F3333330A0000000000000000000000002A2A2A062B2B2B7B2B2B2BF02C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF02B2B2B7A2A2A2A0600000000000000002C2C2C2E2B2B2BE32C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BE42B2B2B2F00000000000000002A2A2A542C2C2CF92C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BEF2C2C
    2CB32C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CB32B2B
    2BF02C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CF82B2B2B5200000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CB13636
    360E333333053333330533333305333333053333330533333305333333053333
    33053333330533333305333333053333330533333305333333053333330F2C2C
    2CB32C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CA63333
    3305000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000333333052C2C
    2CA82C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BC22D2D
    2D2D2F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F
    2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202C2C2C2E2C2C
    2CC42C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B
    2BE42B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BE42B2B
    2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFD2B2B2BFA2B2B2BFC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BFC2B2B2BFA2C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B2BFB2B2B
    2BFB2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFD2B2B2BFA2B2B2BFC2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFC2B2B2BFA2C2C2CFD2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BF52B2B2B872A2A2A592A2A2A6B2B2B2BDD2C2C2CFF2C2C2CFF2C2C2CDB2B2B
    2B692A2A2A592D2D2D882B2B2BF52C2C2CFF2C2C2CFE2B2B2BB02C2C2C5C2B2B
    2B5D2C2C2CB32C2C2CFE2C2C2CFF2B2B2BF52B2B2B872A2A2A592A2A2A6B2B2B
    2BDD2C2C2CFF2C2C2CFF2C2C2CDB2B2B2B692A2A2A592D2D2D882B2B2BF52C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BDF2D2D2D22000000002A2A2A062B2B2BAA2C2C2CFF2C2C2CFF2C2C2CA82A2A
    2A06000000002B2B2B232C2C2CE02C2C2CFF2B2B2BFA2C2C2C5B000000000000
    00002C2C2C5C2B2B2BFA2C2C2CFF2B2B2BDF2D2D2D22000000002A2A2A062B2B
    2BAA2C2C2CFF2C2C2CFF2C2C2CA82A2A2A06000000002B2B2B232C2C2CE02C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BE02D2D2D22000000002A2A2A062B2B2BAA2C2C2CFF2C2C2CFF2C2C2CA82A2A
    2A06000000002B2B2B232C2C2CE12C2C2CFF2B2B2BFA2D2D2D5A000000000000
    00002B2B2B5D2B2B2BFB2C2C2CFF2B2B2BE02D2D2D22000000002A2A2A062B2B
    2BAA2C2C2CFF2C2C2CFF2C2C2CA82A2A2A06000000002B2B2B232C2C2CE12C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BF42B2B2B862B2B2B582D2D2D662C2C2CDB2C2C2CFF2C2C2CFF2C2C2CDB2C2C
    2C682B2B2B582C2C2C852B2B2BF42C2C2CFF2C2C2CFE2C2C2CB12C2C2C5B2C2C
    2C5C2B2B2BB42C2C2CFE2C2C2CFF2B2B2BF42B2B2B862B2B2B582D2D2D662C2C
    2CDB2C2C2CFF2C2C2CFF2C2C2CDB2C2C2C682B2B2B582C2C2C852B2B2BF42C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFD2B2B2BFA2B2B2BFB2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BFB2B2B2BFA2C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B2BFA2B2B
    2BFA2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFD2B2B2BFA2B2B2BFB2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B2BFA2C2C2CFD2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CFE2C2C2CEC2B2B2BDF2B2B2BE42B2B2BFB2C2C2CFF2C2C2CFF2B2B2BFB2B2B
    2BE52B2B2BDF2C2C2CED2C2C2CFE2C2C2CFF2C2C2CFF2B2B2BF52C2C2CE02C2C
    2CE12B2B2BF52C2C2CFF2C2C2CFF2C2C2CFE2C2C2CEC2B2B2BDF2B2B2BE42B2B
    2BFB2C2C2CFF2C2C2CFF2B2B2BFB2B2B2BE52B2B2BDF2C2C2CED2C2C2CFE2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2C2C
    2CEB2C2C2C502E2E2E212C2C2C2E2C2C2CC42C2C2CFF2C2C2CFF2C2C2CC42B2B
    2B2F2E2E2E212C2C2C512C2C2CEC2C2C2CFF2C2C2CFD2B2B2B862B2B2B232B2B
    2B232A2A2A892C2C2CFD2C2C2CFF2C2C2CEB2C2C2C502E2E2E212C2C2C2E2C2C
    2CC42C2C2CFF2C2C2CFF2C2C2CC42B2B2B2F2E2E2E212C2C2C512C2C2CEC2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BDE2F2F2F2000000000333333052C2C2CA82C2C2CFF2C2C2CFF2C2C2CA63333
    3305000000002E2E2E212C2C2CDF2C2C2CFF2B2B2BFA2B2B2B58000000000000
    00002A2A2A5A2B2B2BFA2C2C2CFF2B2B2BDE2F2F2F2000000000333333052C2C
    2CA82C2C2CFF2C2C2CFF2C2C2CA633333305000000002E2E2E212C2C2CDF2C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A592B2B2BFA2C2C2CFF2B2B
    2BE42C2C2C2E333333053636360E2C2C2CB32C2C2CFF2C2C2CFF2C2C2CB13636
    360E333333052B2B2B2F2C2C2CE52C2C2CFF2B2B2BFC2C2C2C682A2A2A062A2A
    2A062B2B2B692B2B2BFB2C2C2CFF2B2B2BE42C2C2C2E333333053636360E2C2C
    2CB32C2C2CFF2C2C2CFF2C2C2CB13636360E333333052B2B2B2F2C2C2CE52C2C
    2CFF2B2B2BFA2B2B2B5700000000000000002A2A2A542C2C2CF92C2C2CFF2B2B
    2BFB2C2C2CC52C2C2CA62C2C2CB22B2B2BF02C2C2CFF2C2C2CFF2B2B2BEF2C2C
    2CB12C2C2CA62B2B2BC22B2B2BFB2C2C2CFF2C2C2CFF2C2C2CDB2B2B2BA92C2C
    2CA82C2C2CDB2C2C2CFF2C2C2CFF2B2B2BFB2C2C2CC52C2C2CA62C2C2CB22B2B
    2BF02C2C2CFF2C2C2CFF2B2B2BEF2C2C2CB12C2C2CA62B2B2BC22B2B2BFB2C2C
    2CFF2C2C2CF92B2B2B5200000000000000002B2B2B2F2C2C2CE42C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2B2B2BE42A2A2A3000000000000000002A2A2A062B2B2B7C2C2C2CF12C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CF12B2B2B7C242424070000000000000000000000002E2E2E0B2B2B2B532C2C
    2C962C2C2CA72C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA72C2C2C962C2C
    2C512E2E2E0B0000000000000000000000000000000000000000000000000000
    0002333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305333333053333
    3305333333053333330533333305333333053333330533333305000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000FFFFFFFFFF000000FFFFFFFFFF000000FFFF
    FFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000FFFF
    FFFFFF000000F00000000F000000C00000000300000080000000010000008000
    000001000000800000000100000080000000010000008007FFE0010000008000
    0000010000008000000001000000800000000100000080000000010000008000
    0000010000008204182041000000820418204100000080000000010000008000
    0000010000008000000001000000800000000100000080000000010000008204
    1820410000008000000001000000800000000100000080000000010000008000
    000001000000C000000003000000F00000000F000000FFFFFFFFFF000000FFFF
    FFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000FFFFFFFFFF000000FFFF
    FFFFFF000000FFFFFFFFFF000000280000002000000040000000010020000000
    0000801000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000002C2C
    2C172A2A2A482A2A2A592D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D
    2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D
    2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D2D5A2D2D
    2D5A2A2A2A592B2B2B47303030150000000000000000000000002D2D2D222C2C
    2CB72B2B2BF52B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BF42B2B2BB62E2E2E2100000000000000012C2C2C7D2C2C
    2CFC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFD2A2A2A7D000000013F3F3F042B2B2BA32C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFE2C2C2CA72B2B
    2B5D2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C
    2C5B2C2C2C5B2C2C2C5B2C2C2C5C2B2B2BA92C2C2CFE2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CA23F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2C2C2C5B0000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000002C2C2C5C2B2B2BFB2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFD2D2D2D7B2727
    27202929291F2929291F2929291F2929291F2929291F2929291F2929291F2929
    291F2929291F2929291F2F2F2F202C2C2C7E2B2B2BFD2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CF12C2C
    2CE02B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2C2C2CE02C2C2CF22C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CF92C2C2CBD2C2C2CA72C2C2CD62C2C2CFF2C2C2CFE2C2C2CD52C2C
    2CA72C2C2CBE2B2B2BFA2C2C2CFF2C2C2CEB2C2C2CAD2B2B2BAE2C2C2CEC2C2C
    2CFF2C2C2CF92C2C2CBD2C2C2CA72C2C2CD62C2C2CFF2C2C2CFE2C2C2CD52C2C
    2CA72C2C2CBE2B2B2BFA2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CE22C2C2C28333333052D2D2D652B2B2BFC2B2B2BFC2D2D2D643333
    33052B2B2B292C2C2CE32C2C2CFF2C2C2CAC2E2E2E0B2E2E2E0B2A2A2AAD2C2C
    2CFF2C2C2CE22C2C2C28333333052D2D2D652B2B2BFC2B2B2BFC2D2D2D643333
    33052B2B2B292C2C2CE32C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CE32C2C2C283F3F3F042D2D2D642B2B2BFC2B2B2BFC2D2D2D643F3F
    3F042B2B2B292B2B2BE32C2C2CFF2A2A2AAC3333330A2E2E2E0B2B2B2BAE2C2C
    2CFF2C2C2CE32C2C2C283F3F3F042D2D2D642B2B2BFC2B2B2BFC2D2D2D643F3F
    3F042B2B2B292B2B2BE32C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2B2B2BFA2B2B2BBC2B2B2BA52B2B2BD32C2C2CFF2C2C2CFF2C2C2CD42B2B
    2BA52B2B2BBC2C2C2CF92C2C2CFF2C2C2CEB2C2C2CAC2C2C2CAD2C2C2CED2C2C
    2CFF2B2B2BFA2B2B2BBC2B2B2BA52B2B2BD32C2C2CFF2C2C2CFF2C2C2CD42B2B
    2BA52B2B2BBC2C2C2CF92C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CFE2B2B2BEA2C2C2CE12C2C2CF22C2C2CFF2C2C2CFF2C2C2CF22C2C
    2CE12B2B2BEA2C2C2CFE2C2C2CFF2B2B2BFA2B2B2BE32B2B2BE42B2B2BFA2C2C
    2CFF2C2C2CFE2B2B2BEA2C2C2CE12C2C2CF22C2C2CFF2C2C2CFF2C2C2CF22C2C
    2CE12B2B2BEA2C2C2CFE2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2B2B2BE92B2B2B472E2E2E212C2C2C7E2B2B2BFD2B2B2BFD2C2C2C7E2E2E
    2E212E2E2E482C2C2CEA2C2C2CFF2B2B2BBC2B2B2B292B2B2B292A2A2ABE2C2C
    2CFF2B2B2BE92B2B2B472E2E2E212C2C2C7E2B2B2BFD2B2B2BFD2C2C2C7E2E2E
    2E212E2E2E482C2C2CEA2C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA52C2C
    2CFF2C2C2CDF27272720000000002C2C2C5C2B2B2BFB2B2B2BFB2C2C2C5B0000
    00002E2E2E212C2C2CE12C2C2CFF2B2B2BA63F3F3F043F3F3F042A2A2AA72C2C
    2CFF2C2C2CDF27272720000000002C2C2C5C2B2B2BFB2B2B2BFB2C2C2C5B0000
    00002E2E2E212C2C2CE12C2C2CFF2B2B2BA43F3F3F043F3F3F042B2B2BA32C2C
    2CFF2C2C2CF22C2C2C7E2C2C2C5B2C2C2CA82C2C2CFE2C2C2CFE2C2C2CA72C2C
    2C5B2C2C2C7D2C2C2CF22C2C2CFF2C2C2CD42B2B2B642B2B2B642C2C2CD52C2C
    2CFF2C2C2CF22C2C2C7E2C2C2C5B2C2C2CA82C2C2CFE2C2C2CFE2C2C2CA72C2C
    2C5B2C2C2C7D2C2C2CF22C2C2CFF2C2C2CA23F3F3F04000000012C2C2C7E2C2C
    2CFD2C2C2CFF2C2C2CFD2B2B2BFB2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BFB2C2C2CFC2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BFB2B2B2BFB2C2C2CFF2C2C
    2CFF2C2C2CFF2C2C2CFD2B2B2BFB2C2C2CFE2C2C2CFF2C2C2CFF2C2C2CFE2B2B
    2BFB2C2C2CFC2C2C2CFF2C2C2CFD2C2C2C7E00000001000000002D2D2D222C2C
    2CB92B2B2BF52B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B2BFB2B2B
    2BFB2B2B2BFB2B2B2BF52C2C2CB82D2D2D220000000000000000000000002C2C
    2C172D2D2D492C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C
    2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C
    2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C2C5B2C2C
    2C5B2C2C2C5B2D2D2D492E2E2E16000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000003800000010000000000000000003F
    FC00000000000000000000000000000000000000000000000000000000000000
    0000000000000000000004200420000000000000000080000001C0000003FFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000
    0000010020000000000060090000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000002303030152F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F
    2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F2F202F2F
    2F202F2F2F202F2F2F202F2F2F202F2F2F203030301500000002000000000000
    00022B2B2B572B2B2BCC2B2B2BDE2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B
    2BDF2B2B2BDF2B2B2BDF2B2B2BDF2B2B2BDE2B2B2BCB2C2C2C56000000023030
    30152B2B2BCC2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFD2C2C2CE72C2C
    2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C
    2CE72C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BCB242424152F2F
    2F202B2B2BDF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CE62E2E2E422E2E
    2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212D2D
    2D432C2C2CE72C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BE62F2F2F412727
    2720272727202727272027272720272727202727272027272720272727202E2E
    2E422C2C2CE72C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFD2C2C2CE62B2B
    2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2C2C
    2CE62C2C2CFD2C2C2CFF2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CFD2C2C2CE72C2C2CE72C2C2CFD2C2C2CFD2C2C2CE62C2C
    2CE72C2C2CFD2C2C2CFD2C2C2CE62C2C2CE72C2C2CFD2C2C2CFD2C2C2CE72C2C
    2CE72C2C2CFD2C2C2CFD2C2C2CE62C2C2CE72C2C2CFD2B2B2BDE2929291F2F2F
    2F202B2B2BDF2B2B2BE62E2E2E422D2D2D432C2C2CE72B2B2BE62E2E2E422D2D
    2D432C2C2CE72C2C2CE62B2B2B412E2E2E422C2C2CE72B2B2BE62E2E2E422D2D
    2D432C2C2CE72B2B2BE62E2E2E422D2D2D432C2C2CE72B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CE62F2F2F412B2B2B412C2C2CE72B2B2BE62B2B2B412A2A
    2A422C2C2CE72B2B2BE62B2B2B402E2E2E422C2C2CE72C2C2CE62F2F2F412B2B
    2B412C2C2CE72B2B2BE62B2B2B412A2A2A422C2C2CE72B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CFD2C2C2CE62C2C2CE52C2C2CFD2C2C2CFD2C2C2CE62C2C
    2CE62C2C2CFD2C2C2CFD2C2C2CE62C2C2CE62C2C2CFD2C2C2CFD2C2C2CE62C2C
    2CE52C2C2CFD2C2C2CFD2C2C2CE62C2C2CE62C2C2CFD2B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CFD2C2C2CE72C2C2CE62C2C2CFD2C2C2CFD2C2C2CE72C2C
    2CE72C2C2CFD2C2C2CFD2C2C2CE62C2C2CE72C2C2CFD2C2C2CFD2C2C2CE72C2C
    2CE62C2C2CFD2C2C2CFD2C2C2CE72C2C2CE72C2C2CFD2B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CE62E2E2E422D2D2D432C2C2CE72C2C2CE72E2E2E422D2D
    2D432C2C2CE72C2C2CE62A2A2A422D2D2D432C2C2CE72C2C2CE62E2E2E422D2D
    2D432C2C2CE72C2C2CE72E2E2E422D2D2D432C2C2CE72B2B2BDE2929291F2F2F
    2F202B2B2BDF2C2C2CE62E2E2E422E2E2E422C2C2CE72B2B2BE62F2F2F412E2E
    2E422C2C2CE72B2B2BE62B2B2B412E2E2E422C2C2CE72C2C2CE62E2E2E422E2E
    2E422C2C2CE72B2B2BE62F2F2F412E2E2E422C2C2CE72B2B2BDE2929291F3030
    30152B2B2BCD2C2C2CFD2C2C2CE72C2C2CE62C2C2CFD2C2C2CFD2C2C2CE62C2C
    2CE62C2C2CFD2C2C2CFD2C2C2CE62C2C2CE62C2C2CFD2C2C2CFD2C2C2CE72C2C
    2CE62C2C2CFD2C2C2CFD2C2C2CE62C2C2CE62C2C2CFD2B2B2BCC303030150000
    00022B2B2B582B2B2BCD2C2C2CDF2C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C
    2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CE02C2C
    2CE02C2C2CE02C2C2CE02C2C2CE02C2C2CDF2B2B2BCC2B2B2B58000000020000
    0000000000022E2E2E162E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E
    2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E2E212E2E
    2E212E2E2E212E2E2E212E2E2E212E2E2E213030301500000002000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000FFFF
    FF00FFFFFF00FFFFFF00FFFFFF00800001000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000080000100FFFFFF00FFFFFF00FFFFFF00FFFFFF002800
    0000140000002800000001002000000000009006000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000032A2A
    2A0C3333330F3333330F3333330F3333330F3333330F3333330F3333330F3333
    330F3333330F3333330F3333330F3333330F3333330F3333330F2A2A2A0C0000
    000200000000242424072D2D2D712B2B2BC12B2B2BC62B2B2BC62B2B2BC62B2B
    2BC62B2B2BC62B2B2BC62B2B2BC62B2B2BC62B2B2BC62B2B2BC62B2B2BC62B2B
    2BC62B2B2BC62B2B2BC62B2B2BC02B2B2B6F242424072E2E2E2C2C2C2CE62C2C
    2CFF2C2C2CFF2C2C2CFF2B2B2BF62B2B2BCD2B2B2BC82B2B2BC82B2B2BC82B2B
    2BC82B2B2BC82B2B2BC82B2B2BCD2B2B2BF62C2C2CFF2C2C2CFF2C2C2CFF2C2C
    2CE62F2F2F2B2C2C2C392B2B2BF02C2C2CFF2C2C2CFF2C2C2CFF2B2B2BCC3131
    311F3333330F3333330F3333330F3333330F3333330F3333330F3131311F2B2B
    2BCE2C2C2CFF2C2C2CFF2C2C2CFF2B2B2BF02E2E2E372C2C2C392B2B2BF02C2C
    2CFF2C2C2CFF2C2C2CFF2C2C2CE72C2C2C8A2C2C2C7F2C2C2C7F2C2C2C7F2C2C
    2C7F2C2C2C7F2C2C2C7F2C2C2C8B2B2B2BE82C2C2CFF2C2C2CFF2C2C2CFF2B2B
    2BF02E2E2E372C2C2C392B2B2BF02B2B2BFA2C2C2CF32C2C2CFD2C2C2CFD2C2C
    2CF32B2B2BFA2C2C2CFF2B2B2BF62B2B2BF62C2C2CFF2B2B2BFA2C2C2CF32C2C
    2CFD2C2C2CFD2C2C2CF32B2B2BFA2B2B2BF02E2E2E372C2C2C392B2B2BF02B2B
    2BA32D2D2D492B2B2BD92B2B2BD72E2E2E482B2B2BA42B2B2BF52B2B2B6A2D2D
    2D6B2B2B2BF52B2B2BA32D2D2D492B2B2BD92B2B2BD72E2E2E482B2B2BA42B2B
    2BF02E2E2E372C2C2C392B2B2BF02B2B2BA32B2B2B472B2B2BD82B2B2BD72B2B
    2B472B2B2BA32B2B2BF52B2B2B692D2D2D6B2B2B2BF52B2B2BA32B2B2B472B2B
    2BD82B2B2BD72B2B2B472B2B2BA32B2B2BF02E2E2E372C2C2C392B2B2BF02B2B
    2BFA2C2C2CF22C2C2CFD2C2C2CFD2C2C2CF22B2B2BFA2C2C2CFF2B2B2BF52B2B
    2BF52C2C2CFF2B2B2BFA2C2C2CF22C2C2CFD2C2C2CFD2C2C2CF22B2B2BFA2B2B
    2BF02E2E2E372C2C2C392B2B2BF02B2B2BC72B2B2B8C2B2B2BE82B2B2BE82B2B
    2B8C2C2C2CC82B2B2BFA2C2C2CA22B2B2BA42B2B2BFA2B2B2BC72B2B2B8C2B2B
    2BE82B2B2BE82B2B2B8C2C2C2CC82B2B2BF02E2E2E372C2C2C392B2B2BF02B2B
    2B8C3131311F2B2B2BCE2B2B2BCC3131311F2B2B2B8C2C2C2CF22E2E2E472E2E
    2E482C2C2CF22B2B2B8C3131311F2B2B2BCE2B2B2BCC3131311F2B2B2B8C2B2B
    2BF02E2E2E372D2D2D2D2C2C2CE62B2B2BE82B2B2BCD2B2B2BF62B2B2BF52B2B
    2BCC2B2B2BE82C2C2CFD2B2B2BD72B2B2BD72C2C2CFD2B2B2BE82B2B2BCD2B2B
    2BF62B2B2BF52B2B2BCC2B2B2BE82C2C2CE62E2E2E2C1F1F1F082C2C2C722C2C
    2CC22B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B
    2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC82B2B2BC22A2A
    2A711F1F1F0800000000000000032727270D3333330F3333330F3333330F3333
    330F3333330F3333330F3333330F3333330F3333330F3333330F3333330F3333
    330F3333330F3333330F2727270D000000030000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000FFFFF000FFFFF000FFFFF0008000100000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000080001000FFFFF000FFFFF000FFFFF00028000000100000002000
    0000010020000000000040040000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000013F3F3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F
    3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F3F0400000001000000002A2A
    2A122C2C2C7D2C2C2CA52C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C
    2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA62C2C2CA52B2B2B7C2D2D2D112B2B
    2B4D2B2B2BF62C2C2CFF2C2C2CFF2B2B2BE42B2B2BAA2C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82B2B2BAA2B2B2BE52C2C2CFF2C2C2CFF2B2B2BF62C2C2C4B2A2A
    2A592B2B2BFB2C2C2CFF2C2C2CFF2C2C2CB62D2D2D272B2B2B232B2B2B232B2B
    2B232B2B2B232C2C2C282C2C2CB82C2C2CFF2C2C2CFF2B2B2BFB2B2B2B572A2A
    2A592B2B2BFB2C2C2CFC2C2C2CFE2B2B2BF52B2B2BDE2B2B2BDF2B2B2BDD2B2B
    2BDD2B2B2BDF2B2B2BDE2B2B2BF52C2C2CFE2C2C2CFC2B2B2BFB2B2B2B572A2A
    2A592B2B2BE92B2B2B752B2B2BCB2C2C2CCA2B2B2B762C2C2CEB2B2B2B982B2B
    2B992C2C2CEB2B2B2B752B2B2BCB2C2C2CCA2B2B2B762B2B2BE92B2B2B572A2A
    2A592B2B2BE92B2B2B742C2C2CCA2C2C2CC92B2B2B742C2C2CEB2B2B2B972B2B
    2B982C2C2CEB2B2B2B742C2C2CCA2C2C2CC92B2B2B742B2B2BE92B2B2B572A2A
    2A592B2B2BF82B2B2BE42B2B2BF52B2B2BF52B2B2BE42B2B2BFC2C2C2CEB2C2C
    2CEC2B2B2BFC2B2B2BE42B2B2BF52B2B2BF52B2B2BE42C2C2CF82B2B2B572A2A
    2A592C2C2CE22B2B2B462C2C2CB82C2C2CB72B2B2B472B2B2BE42B2B2B742B2B
    2B762B2B2BE32B2B2B462C2C2CB82C2C2CB72B2B2B472C2C2CE22B2B2B572B2B
    2B4D2C2C2CED2B2B2BB72B2B2BE42B2B2BE32B2B2BB62B2B2BF52C2C2CC92C2C
    2CC92B2B2BF52B2B2BB72B2B2BE42B2B2BE32B2B2BB62C2C2CED2B2B2B4C2A2A
    2A122C2C2C7F2C2C2CA72C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C
    2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA82C2C2CA72C2C2C7E2A2A2A120000
    0000000000013F3F3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F
    3F043F3F3F043F3F3F043F3F3F043F3F3F043F3F3F0400000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000FFFF
    0000FFFF00008001000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000080010000FFFF0000FFFF0000}
  OldCreateOrder = False
  Position = poDesktopCenter
  PixelsPerInch = 96
  TextHeight = 28
  object edtSelect: TEdit
    Left = 15
    Top = 10
    Width = 161
    Height = 36
    BorderStyle = bsNone
    Color = clBtnFace
    Font.Charset = ANSI_CHARSET
    Font.Color = clGray
    Font.Height = -24
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 0
  end
  object edtText: TEdit
    Left = 180
    Top = 10
    Width = 161
    Height = 39
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -24
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 1
  end
  object sBitBtn50: TsBitBtn
    Left = 345
    Top = 5
    Width = 51
    Height = 46
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 2
    OnClick = sBitBtn50Click
    Glyph.Data = {
      36100000424D3610000000000000360000002800000020000000200000000100
      20000000000000100000C40E0000C40E00000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000003F3F3F04303030152B2B
      2B1D2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A
      2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2B2B2B1D303030153F3F3F040000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000002E2E2E162B2B2B862C2C2CCF2C2C
      2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C
      2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CDB2C2C2CCF2C2C2C852626
      2614000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000333333052C2C2C892B2B2BFA2C2C2CF12B2B
      2BE32C2C2CE22C2C2CE22C2C2CE22C2C2CE22C2C2CE22C2C2CE22C2C2CE22C2C
      2CE22C2C2CE22C2C2CE22C2C2CE22C2C2CE22B2B2BE32C2C2CF12B2B2BFA2B2B
      2B863F3F3F040000000000000000000000000000000000000000000000000000
      00000000000000000000000000002A2A2A182B2B2BD32C2C2CF02B2B2B5D2A2A
      2A242B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B2B232B2B
      2B232B2B2B232B2B2B232B2B2B232B2B2B232A2A2A242B2B2B5D2C2C2CF02B2B
      2BD22C2C2C170000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF272727200000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000002E2E2E212C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      000000000000000000002A2A2A0C2A2A2A0C0000000000000000000000000000
      00002A2A2A0C2A2A2A0C0000000000000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F102C2C2CA22C2C2CA03333330F00000000000000002F2F
      2F102C2C2CA22C2C2CA02222220F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CDF2B2B2BDD3131311F00000000000000002E2E
      2E212B2B2BDE2C2C2CDE2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDF2C2C2CDF2929291F0000
      0000000000002F2F2F202C2C2CE02B2B2BDE2F2F2F2000000000000000002E2E
      2E212B2B2BDF2C2C2CDF2929291F00000000000000002F2F2F202C2C2CE02B2B
      2BDE2F2F2F200000000000000000000000000000000000000000000000000000
      00000000000000000000000000002E2E2E212B2B2BDE2C2C2CDE2A2A2A1E0000
      0000000000002F2F2F202C2C2CE02B2B2BDD3131311F00000000000000002E2E
      2E212B2B2BDE2C2C2CDE2A2A2A1E00000000000000003131311F2C2C2CDF2B2B
      2BDD3131311F0000000000000000000000000000000000000000000000000000
      00000000000000000000000000002F2F2F102C2C2CA62C2C2CA53333330F0000
      0000000000002F2F2F102B2B2BA42C2C2CA13333330F00000000000000002F2F
      2F102B2B2BA32C2C2CA23333330F00000000000000003333330F2C2C2CA22C2C
      2C9F3333330F0000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000003333330F3333330F000000000000
      000000000000000000002727270D2727270D0000000000000000000000000000
      00002727270D2727270D000000000000000000000000000000002727270D2A2A
      2A0C000000000000000000000000000000000000000000000000000000000000
      00002F2F2F102929291F27272720272727202727272027272720272727202727
      2720272727202727272027272720272727202727272027272720272727202727
      2720272727202727272027272720272727202727272027272720272727202727
      27202727272027272720272727202F2F2F100000000000000000000000002424
      240E2B2B2BA52B2B2BDD2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
      2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
      2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B2BDE2B2B
      2BDE2B2B2BDE2B2B2BDE2B2B2BDD2B2B2BA42727270D00000000000000002727
      270D2C2C2CA12C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CE12B2B2BFB2B2B
      2BFA2C2C2CE12C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C
      2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CE12B2B2BFB2B2B2BFB2C2C2CE12C2C
      2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CA12727270D00000000000000000000
      00003636360E2B2B2B1D2A2A2A1E2A2A2A1E2A2A2A1E2B2B2B3A2C2C2CE42C2C
      2CE22B2B2B3A2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A2A1E2A2A
      2A1E2A2A2A1E2A2A2A1E2A2A2A1E2B2B2B3B2B2B2BE32C2C2CE32C2C2C392A2A
      2A1E2A2A2A1E2A2A2A1E2A2A2A1E3333330F0000000000000000000000000000
      000000000000000000000000000000000000000000002F2F2F202C2C2CE02B2B
      2BDF2E2E2E210000000000000000000000000000000000000000000000000000
      00000000000000000000000000002D2D2D222B2B2BDF2C2C2CDF2929291F0000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000002A2A2A182C2C2CD32B2B
      2BEF2C2C2C5B2D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D2D222D2D
      2D222D2D2D222D2D2D222D2D2D222B2B2B582B2B2BEF2B2B2BD32A2A2A180000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000333333052D2D2D882B2B
      2BFA2C2C2CF12C2C2CE22C2C2CE12C2C2CE12C2C2CE12C2C2CE12C2C2CE12C2C
      2CE12C2C2CE12C2C2CE12C2C2CE12B2B2BEF2B2B2BFA2B2B2B87333333050000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000002E2E2E162B2B
      2B862B2B2BD12C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C
      2CDC2C2C2CDC2C2C2CDC2C2C2CDC2C2C2CD02B2B2B872E2E2E16000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000003F3F
      3F042E2E2E162A2A2A1E2929291F2929291F2929291F2929291F2929291F2929
      291F2929291F2929291F2A2A2A1E2E2E2E163F3F3F0400000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000}
    SkinData.SkinSection = 'BUTTON'
  end
  object sBitBtn51: TsBitBtn
    Left = 400
    Top = 5
    Width = 51
    Height = 46
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 3
    OnClick = sBitBtn51Click
    Glyph.Data = {
      36100000424D3610000000000000360000002800000020000000200000000100
      20000000000000100000C40E0000C40E00000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000242424072D2D2D4E2A2A2A2400000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000242424072C2C2C6C2C2C2CEC2B2B2BBB28282826000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000242424072D2D2D6B2B2B2BEE2C2C2CFD2C2C2CFC2B2B2BBB282828260000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000002424
      24072A2A2A6B2B2B2BEE2C2C2CF12B2B2B8E2B2B2BC62C2C2CFC2B2B2BBA2828
      2826000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000242424072D2D
      2D6B2C2C2CED2C2C2CF12B2B2B75383838092C2C2C2E2C2C2CC52B2B2BFC2B2B
      2BBA282828260000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000242424072C2C2C6C2B2B
      2BEE2B2B2BF12B2B2B751C1C1C0900000000000000012D2D2D2D2C2C2CC52C2C
      2CFC2B2B2BBB2828282600000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000242424072D2D2D6B2B2B2BEE2C2C
      2CF12B2B2B751C1C1C09000000000000000000000000000000012C2C2C2E2C2C
      2CC52C2C2CFC2B2B2BBB28282826000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000002B2B2B582C2C2CED2C2C2CF12B2B
      2B751C1C1C090000000000000000000000000000000000000000000000012D2D
      2D2D2C2C2CC52C2C2CFC2B2B2BBA282828260000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000002A2A2A712C2C2CE02B2B2B743838
      3809000000000000000000000000000000000000000000000000000000000000
      00002C2C2C2E2C2C2CC52B2B2BFC2B2B2BBA2828282600000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000002727270D2D2D2D27242424070000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000012D2D2D2D2C2C2CC52C2C2CFC2B2B2BBB28282826000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000012C2C2C2E2C2C2CC52C2C2CFC2B2B2BBB282828260000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000012D2D2D2D2C2C2CC52C2C2CFC2B2B2BBA2828
      2826000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000002C2C2C2E2C2C2CC52B2B2BFC2B2B
      2BBA282828260000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000012D2D2D2D2C2C2CC52C2C
      2CFC2B2B2BBB2828282600000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000012C2C2C2E2C2C
      2CC52C2C2CFC2B2B2BBB28282826000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000012D2D
      2D2D2C2C2CC52C2C2CFC2B2B2BBA2B2B2B230000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00002C2C2C2E2C2C2CC52B2B2BFC2C2C2C7E0000000100000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000012A2A2A2A2B2B2B862E2E2E370000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000001000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000}
    SkinData.SkinSection = 'BUTTON'
  end
  object sBitBtn52: TsBitBtn
    Left = 455
    Top = 5
    Width = 51
    Height = 46
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 4
    OnClick = sBitBtn52Click
    Glyph.Data = {
      36090000424D3609000000000000360000002800000018000000180000000100
      20000000000000090000C40E0000C40E00000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000013F3F3F085C5C5C0B5C5C
      5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C
      5C0B5C5C5C0B5C5C5C0B5C5C5C0B5C5C5C0B4C4C4C0A7F7F7F02000000000000
      0000000000000000000000000000000000015050503F515151AF505050BF5050
      50BF505050BF505050BF505050BF505050BF505050BF505050BF505050BF5050
      50BF505050BF505050BF505050BF505050BF515151B950505068000000000000
      000000000000000000000000000050505023505050CA515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF505050D4000000000000
      000000000000000000004E4E4E0D5050509E505050FD515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC000000000000
      000000000000555555035151516A515151F4515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC000000000000
      0000000000005050503C505050E1515151FF515151FF515151FF515151FF5050
      50FD505050FD515151FF515151FF515151FF515151FF515151FF515151FF5050
      50FD505050FD515151FF515151FF515151FF515151FF515151DC000000000000
      00004E4E4E1A505050BE515151FE515151FF515151FF515151FF505050FA5050
      508F50505092515151F5515151FF515151FF515151FF515151FF515151F25050
      508950505098505050FC515151FF515151FF515151FF515151DC000000005454
      54095050508E515151FB515151FF515151FF515151FF515151FF515151F85050
      50655555550F50505085515151F5515151FF515151FF515151F2505050784E4E
      4E0D52525273515151FB515151FF515151FF515151FF515151DC7F7F7F025151
      515B505050F0515151FF515151FF515151FF515151FF515151FF515151FF5151
      51E25151514E5555550F51515186505050F6505050F35151517A4E4E4E0D5252
      525A515151E7515151FF515151FF515151FF515151FF515151DC5151512F5151
      51D8515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151DF5050504C4F4F4F10505050855151517A5B5B5B0E515151585050
      50E6515151FF515151FF515151FF515151FF515151FF515151DC505050AB5151
      51FE515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151DF50505049545454095454540951515154515151E55151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC505050AB5151
      51FE515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151F550505072555555033F3F3F0451515181515151F85151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC4F4F4F305151
      51D9515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF505050F7505050885555550F4E4E4E445050503C54545412505050945050
      50F9515151FF515151FF515151FF515151FF515151FF515151DC7F7F7F025050
      505C505050F0515151FF515151FF515151FF515151FF515151FF515151FF5050
      50F75050508C4F4F4F104F4F4F4D505050E0515151D9515151424C4C4C144F4F
      4F99505050F9515151FF515151FF515151FF515151FF515151DC000000005454
      54095050508F515151FB515151FF515151FF515151FF515151FF505050FC5151
      51934B4B4B1151515148515151DE515151FF515151FF505050D75252523E4848
      4815505050A1515151FD515151FF515151FF515151FF515151DC000000000000
      00004B4B4B1B515151BF515151FE515151FF515151FF515151FF505050F65252
      525D4F4F4F4D515151DB515151FF515151FF515151FF515151FF505050D44E4E
      4E445151516A505050FA515151FF515151FF515151FF515151DC000000000000
      0000000000005050503C515151E2515151FF515151FF515151FF515151FE5050
      50E9515151EC515151FF515151FF515151FF515151FF515151FF515151FE5050
      50EA515151EB515151FF515151FF515151FF515151FF515151DC000000000000
      000000000000555555035151516B515151F5515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC000000000000
      000000000000000000004E4E4E0D5050509F505050FD515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151DC000000000000
      000000000000000000000000000050505023515151CB515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF515151FF515151FF5151
      51FF515151FF515151FF515151FF515151FF515151FF505050D4000000000000
      0000000000000000000000000000000000014F4F4F40505050B1515151C05151
      51C0515151C0515151C0515151C0515151C0515151C0515151C0515151C05151
      51C0515151C0515151C0515151C0515151C0505050BB50505069000000000000
      000000000000000000000000000000000000000000015F5F5F085555550C5555
      550C5555550C5555550C5555550C5555550C5555550C5555550C5555550C5555
      550C5555550C5555550C5555550C5555550C4C4C4C0A7F7F7F02000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000}
    SkinData.SkinSection = 'BUTTON'
  end
  object sBitBtn53: TsBitBtn
    Left = 510
    Top = 5
    Width = 51
    Height = 46
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 5
    OnClick = sBitBtn53Click
    Glyph.Data = {
      36100000424D3610000000000000360000002800000020000000200000000100
      20000000000000100000C40E0000C40E00000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000040000001B0000
      001F000000140000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000140000001F0000001B000000040000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000001C000000C40000
      00DF0000008F0000000300000000000000000000000000000000000000000000
      000000000000000000000000000300000090000000DF000000C30000001B0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000010000000400000004000000040000000400000023000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF000000220000
      0004000000040000000400000004000000010000000000000000000000000000
      00000000003B000000A1000000A4000000A4000000A4000000AF000000F40000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000F3000000AF0000
      00A4000000A4000000A4000000A10000003A0000000000000000000000000000
      00000000005B000000FB000000FF000000FF000000FF000000FF000000FF0000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FB0000005A0000000000000000000000000000
      000000000050000000DD000000E0000000E0000000E0000000E0000000E00000
      00E0000000900000000400000000000000000000000000000000000000000000
      000000000000000000000000000400000091000000E0000000E0000000E00000
      00E0000000E0000000E0000000DD0000004F0000000000000000000000000000
      00000000000B0000001F00000020000000200000002000000020000000200000
      0020000000140000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000150000002000000020000000200000
      002000000020000000200000001F0000000B0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000B0000001E0000001F0000001F0000001F0000001F0000001F0000
      001F000000140000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000140000001F0000001F0000001F0000
      001F0000001F0000001F0000001E0000000B0000000000000000000000000000
      000000000050000000DC000000DF000000DF000000DF000000DF000000DF0000
      00DF0000008F0000000300000000000000000000000000000000000000000000
      000000000000000000000000000300000090000000DF000000DF000000DF0000
      00DF000000DF000000DF000000DC0000004F0000000000000000000000000000
      00000000005B000000FB000000FF000000FF000000FF000000FF000000FF0000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FB0000005A0000000000000000000000000000
      00000000003B000000A3000000A5000000A5000000A5000000B0000000F40000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000F4000000B00000
      00A5000000A5000000A5000000A30000003A0000000000000000000000000000
      0000000000020000000400000004000000040000000400000024000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF000000230000
      0004000000040000000400000004000000020000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000020000000E00000
      00FF000000A40000000400000000000000000000000000000000000000000000
      0000000000000000000000000004000000A5000000FF000000DF0000001F0000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000001C000000C50000
      00E0000000900000000400000000000000000000000000000000000000000000
      000000000000000000000000000400000091000000E0000000C40000001B0000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000040000001C0000
      0020000000140000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000015000000200000001C000000040000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000}
    SkinData.SkinSection = 'BUTTON'
  end
  object Button27: TButton
    Tag = 27
    Left = 15
    Top = 55
    Width = 51
    Height = 46
    Caption = '1'
    TabOrder = 6
    OnClick = Button1Click
  end
  object Button28: TButton
    Tag = 28
    Left = 70
    Top = 55
    Width = 51
    Height = 46
    Caption = '2'
    TabOrder = 7
    OnClick = Button1Click
  end
  object Button29: TButton
    Tag = 29
    Left = 125
    Top = 55
    Width = 51
    Height = 46
    Caption = '3'
    TabOrder = 8
    OnClick = Button1Click
  end
  object Button30: TButton
    Tag = 30
    Left = 180
    Top = 55
    Width = 51
    Height = 46
    Caption = '4'
    TabOrder = 9
    OnClick = Button1Click
  end
  object Button31: TButton
    Tag = 31
    Left = 235
    Top = 55
    Width = 51
    Height = 46
    Caption = '5'
    TabOrder = 10
    OnClick = Button1Click
  end
  object Button32: TButton
    Tag = 32
    Left = 290
    Top = 55
    Width = 51
    Height = 46
    Caption = '6'
    TabOrder = 11
    OnClick = Button1Click
  end
  object Button33: TButton
    Tag = 33
    Left = 345
    Top = 55
    Width = 51
    Height = 46
    Caption = '7'
    TabOrder = 12
    OnClick = Button1Click
  end
  object Button34: TButton
    Tag = 34
    Left = 400
    Top = 55
    Width = 51
    Height = 46
    Caption = '8'
    TabOrder = 13
    OnClick = Button1Click
  end
  object Button35: TButton
    Tag = 35
    Left = 455
    Top = 55
    Width = 51
    Height = 46
    Caption = '9'
    TabOrder = 14
    OnClick = Button1Click
  end
  object Button36: TButton
    Tag = 36
    Left = 510
    Top = 55
    Width = 51
    Height = 46
    Caption = '0'
    TabOrder = 15
    OnClick = Button1Click
  end
  object Button1: TButton
    Tag = 1
    Left = 15
    Top = 155
    Width = 51
    Height = 46
    Caption = 'A'
    TabOrder = 16
    OnClick = Button1Click
  end
  object Button2: TButton
    Tag = 2
    Left = 235
    Top = 205
    Width = 51
    Height = 46
    Caption = 'B'
    TabOrder = 17
    OnClick = Button1Click
  end
  object Button3: TButton
    Tag = 3
    Left = 125
    Top = 205
    Width = 51
    Height = 46
    Caption = 'C'
    TabOrder = 18
    OnClick = Button1Click
  end
  object Button4: TButton
    Tag = 4
    Left = 125
    Top = 155
    Width = 51
    Height = 46
    Caption = 'D'
    TabOrder = 19
    OnClick = Button1Click
  end
  object Button5: TButton
    Tag = 5
    Left = 125
    Top = 105
    Width = 51
    Height = 46
    Caption = 'E'
    TabOrder = 20
    OnClick = Button1Click
  end
  object Button6: TButton
    Tag = 6
    Left = 180
    Top = 155
    Width = 51
    Height = 46
    Caption = 'F'
    TabOrder = 21
    OnClick = Button1Click
  end
  object Button7: TButton
    Tag = 7
    Left = 235
    Top = 155
    Width = 51
    Height = 46
    Caption = 'G'
    TabOrder = 22
    OnClick = Button1Click
  end
  object Button8: TButton
    Tag = 8
    Left = 290
    Top = 155
    Width = 51
    Height = 46
    Caption = 'H'
    TabOrder = 23
    OnClick = Button1Click
  end
  object Button9: TButton
    Tag = 9
    Left = 400
    Top = 105
    Width = 51
    Height = 46
    Caption = 'I'
    TabOrder = 24
    OnClick = Button1Click
  end
  object Button10: TButton
    Tag = 10
    Left = 345
    Top = 155
    Width = 51
    Height = 46
    Caption = 'J'
    TabOrder = 25
    OnClick = Button1Click
  end
  object Button11: TButton
    Tag = 11
    Left = 400
    Top = 155
    Width = 51
    Height = 46
    Caption = 'K'
    TabOrder = 26
    OnClick = Button1Click
  end
  object Button12: TButton
    Tag = 12
    Left = 455
    Top = 155
    Width = 51
    Height = 46
    Caption = 'L'
    TabOrder = 27
    OnClick = Button1Click
  end
  object Button13: TButton
    Tag = 13
    Left = 345
    Top = 205
    Width = 51
    Height = 46
    Caption = 'M'
    TabOrder = 28
    OnClick = Button1Click
  end
  object Button14: TButton
    Tag = 14
    Left = 290
    Top = 205
    Width = 51
    Height = 46
    Caption = 'N'
    TabOrder = 29
    OnClick = Button1Click
  end
  object Button15: TButton
    Tag = 15
    Left = 455
    Top = 105
    Width = 51
    Height = 46
    Caption = 'O'
    TabOrder = 30
    OnClick = Button1Click
  end
  object Button16: TButton
    Tag = 16
    Left = 510
    Top = 105
    Width = 51
    Height = 46
    Caption = 'P'
    TabOrder = 31
    OnClick = Button1Click
  end
  object Button17: TButton
    Tag = 17
    Left = 15
    Top = 105
    Width = 51
    Height = 46
    Caption = 'Q'
    TabOrder = 32
    OnClick = Button1Click
  end
  object Button18: TButton
    Tag = 18
    Left = 180
    Top = 105
    Width = 51
    Height = 46
    Caption = 'R'
    TabOrder = 33
    OnClick = Button1Click
  end
  object Button19: TButton
    Tag = 19
    Left = 70
    Top = 155
    Width = 51
    Height = 46
    Caption = 'S'
    TabOrder = 34
    OnClick = Button1Click
  end
  object Button20: TButton
    Tag = 20
    Left = 235
    Top = 105
    Width = 51
    Height = 46
    Caption = 'T'
    TabOrder = 35
    OnClick = Button1Click
  end
  object Button21: TButton
    Tag = 21
    Left = 345
    Top = 105
    Width = 51
    Height = 46
    Caption = 'U'
    TabOrder = 36
    OnClick = Button1Click
  end
  object Button22: TButton
    Tag = 22
    Left = 180
    Top = 205
    Width = 51
    Height = 46
    Caption = 'V'
    TabOrder = 37
    OnClick = Button1Click
  end
  object Button23: TButton
    Tag = 23
    Left = 70
    Top = 105
    Width = 51
    Height = 46
    Caption = 'W'
    TabOrder = 38
    OnClick = Button1Click
  end
  object Button24: TButton
    Tag = 24
    Left = 70
    Top = 205
    Width = 51
    Height = 46
    Caption = 'X'
    TabOrder = 39
    OnClick = Button1Click
  end
  object Button25: TButton
    Tag = 25
    Left = 290
    Top = 105
    Width = 51
    Height = 46
    Caption = 'Y'
    TabOrder = 40
    OnClick = Button1Click
  end
  object Button26: TButton
    Tag = 26
    Left = 15
    Top = 205
    Width = 51
    Height = 46
    Caption = 'Z'
    TabOrder = 41
    OnClick = Button1Click
  end
  object btnZh: TButton
    Left = 400
    Top = 205
    Width = 161
    Height = 46
    Caption = #20999#25442#36755#20837#27861
    TabOrder = 42
    OnClick = btnZhClick
  end
  object Button37: TButton
    Tag = 37
    Left = 510
    Top = 155
    Width = 51
    Height = 46
    Caption = '.'
    TabOrder = 43
    OnClick = Button1Click
  end
end
demo/Keyboard/uMain.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
unit uMain;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XpMan, Buttons, sBitBtn;
type
  TfrmMain = class(TForm)
    edtSelect: TEdit;
    edtText: TEdit;
    sBitBtn50: TsBitBtn;
    sBitBtn51: TsBitBtn;
    sBitBtn52: TsBitBtn;
    sBitBtn53: TsBitBtn;
    Button27: TButton;
    Button28: TButton;
    Button29: TButton;
    Button30: TButton;
    Button31: TButton;
    Button32: TButton;
    Button33: TButton;
    Button34: TButton;
    Button35: TButton;
    Button36: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    Button19: TButton;
    Button20: TButton;
    Button21: TButton;
    Button22: TButton;
    Button23: TButton;
    Button24: TButton;
    Button25: TButton;
    Button26: TButton;
    btnZh: TButton;
    Button37: TButton;
    procedure sBitBtn50Click(Sender: TObject);
    procedure sBitBtn51Click(Sender: TObject);
    procedure sBitBtn52Click(Sender: TObject);
    procedure sBitBtn53Click(Sender: TObject);
    procedure btnZhClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    glInkOutput : String;
    procedure InsertStringAtCursor(EditControl: TEdit; Str: string);
    procedure DeleteCharsBeforeCursor(EditControl: TEdit; Count: Integer=1);
  end;
var
  frmMain: TfrmMain;
implementation
{$R *.dfm}
//------------------------------------------------------------------------------
// æ¨¡æ‹ŸæŒ‰ä¸‹å’Œé‡Šæ”¾æŒ‰é”®
procedure SimulateKeyPress(KeyCode: Word);
begin
  keybd_event(KeyCode, MapVirtualKey(KeyCode, 0), 0, 0);
  keybd_event(KeyCode, MapVirtualKey(KeyCode, 0), KEYEVENTF_KEYUP, 0);
end;
// æ¨¡æ‹ŸæŒ‰ä¸‹å’Œé‡Šæ”¾ç»„合键
procedure SimulateCombinationKeyPress(KeyCode1, KeyCode2: Word);
begin
  keybd_event(KeyCode1, MapVirtualKey(KeyCode1, 0), 0, 0);
  keybd_event(KeyCode2, MapVirtualKey(KeyCode2, 0), 0, 0);
  keybd_event(KeyCode2, MapVirtualKey(KeyCode2, 0), KEYEVENTF_KEYUP, 0);
  keybd_event(KeyCode1, MapVirtualKey(KeyCode1, 0), KEYEVENTF_KEYUP, 0);
end;
//------------------------------------------------------------------------------
//从光标处插入字符
procedure TfrmMain.InsertStringAtCursor(EditControl: TEdit; Str: string);
begin
  // ä¿å­˜å½“前光标位置
  EditControl.SelStart := EditControl.SelStart;
  EditControl.SelLength := 0; // ä¸é€‰æ‹©ä»»ä½•文本,确保只插入而不替换
  EditControl.SelText := Str; // æ’入字符串
end;
//自定义函数:从光标处删除字符
procedure TfrmMain.DeleteCharsBeforeCursor(EditControl: TEdit; Count: Integer=1);
var
  CursorPos, NewStart: Integer;
begin
  CursorPos := EditControl.SelStart;
  if CursorPos >= Count then
  begin
    NewStart := CursorPos - Count; // è®¡ç®—新的选择起点
    EditControl.SelStart := NewStart;
    EditControl.SelLength := Count; // é€‰æ‹©Count个字符
    EditControl.SelText := '';      // åˆ é™¤é€‰å®šçš„æ–‡æœ¬
  end
  else
  begin
    // å¦‚æžœCount大于光标位置,则删除所有在光标之前的字符
    EditControl.SelStart := 0;
    EditControl.SelLength := CursorPos;
    EditControl.SelText := '';
  end;
end;
//------------------------------------------------------------------------------
//清除所有输入
procedure TfrmMain.sBitBtn50Click(Sender: TObject);
begin
  edtSelect.Clear;
end;
//确认字符
procedure TfrmMain.sBitBtn51Click(Sender: TObject);
begin
  //把待选取文字拷贝到edtText中
  InsertStringAtCursor(edtText, Trim(edtSelect.Text));
end;
//删除字符
procedure TfrmMain.sBitBtn52Click(Sender: TObject);
begin
  DeleteCharsBeforeCursor(edtText);
end;
//拷贝输入内容,退出
procedure TfrmMain.sBitBtn53Click(Sender: TObject);
begin
  //将结果更新到全局变量
  glInkOutput := edtText.Text;
  Close();
end;
// åˆ‡æ¢åˆ°ä¸­æ–‡è¾“入法
procedure TfrmMain.btnZhClick(Sender: TObject);
begin
  // å‡è®¾ä½¿ç”¨ Ctrl + ç©ºæ ¼åˆ‡æ¢è¾“入法
  SimulateCombinationKeyPress(VK_CONTROL, VK_SPACE);
end;
//------------------------------------------------------------------------------
// å­—符按钮处理程序
procedure TfrmMain.Button1Click(Sender: TObject);
var
  KeyChar: Char;
  KeyCode: Word;
begin
  //屏幕键盘输入字母
  if TButton(Sender).Tag<=37 then begin
    KeyChar := TButton(Sender).Caption[1]; // æå–按钮 Caption å­—符
    KeyCode := VkKeyScan(KeyChar);
    SimulateKeyPress(KeyCode);
  end;
  edtSelect.SetFocus;
end;
end.
demo/TabTip/Project1.cfg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"d:\program files\borland\delphi7\Projects\Bpl"
-LN"d:\program files\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
demo/TabTip/Project1.dof
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;dbrtl;vcldb;VclSmp;dbexpress;bdertl;vclie;adortl;vclactnband;vclshlctrls;dclOfficeXP;vcldbx;visualclx;visualdbclx;inet;xmlrtl;inetdbbde;inetdbxpress;IndyCore70;IndySystem70;IndyProtocols70;RaizeComponentsVcl;RaizeComponentsVclDb;
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=2052
CodePage=936
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
d:\program files\borland\delphi7\Bin\dclwbm70.bpl=Borland InternetExpress Components
d:\program files\borland\delphi7\Bin\dclindy70.bpl=Internet Direct (Indy) for D7 Property and Component Editors
D:\Program Files\Borland\Delphi7\Bin\dcltee70.bpl=TeeChart Components
d:\program files\borland\delphi7\Bin\dcldss70.bpl=Borland Decision Cube Components
d:\program files\borland\delphi7\Bin\DCLIB70.bpl=InterBase Data Access Components
d:\program files\borland\delphi7\Bin\dclmcn70.bpl=Borland DataSnap Connection Components
D:\Program Files\Borland\Delphi7\Bin\dclmid70.bpl=Borland MyBase DataAccess Components
d:\program files\borland\delphi7\Bin\dcldbxcds70.bpl=Borland SimpleDataset Component (DBX)
d:\program files\borland\delphi7\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package
d:\program files\borland\delphi7\Bin\dclsoap70.bpl=Borland SOAP Components
d:\program files\borland\delphi7\Bin\dclwebsnap70.bpl=Borland WebSnap Components
d:\program files\borland\delphi7\Bin\dclite70.bpl=Borland Integrated Translation Environment
C:\WINDOWS\SysWOW64\ibevnt70.bpl=Borland Interbase Event Alerter Component
demo/TabTip/Project1.dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
demo/TabTip/Project1.exe
Binary files differ
demo/TabTip/Project1.res
Binary files differ
demo/TabTip/TabTip.exe
Binary files differ
demo/TabTip/Unit1.dcu
Binary files differ
demo/TabTip/Unit1.ddp
Binary files differ
demo/TabTip/Unit1.dfm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
object Form1: TForm1
  Left = 192
  Top = 131
  Width = 536
  Height = 348
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -21
  Font.Name = #24494#36719#38597#40657
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 28
  object Button1: TButton
    Left = 100
    Top = 130
    Width = 136
    Height = 56
    Caption = #21551#21160#25163#20889#26495
    TabOrder = 0
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 85
    Top = 60
    Width = 241
    Height = 36
    TabOrder = 1
  end
end
demo/TabTip/Unit1.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TlHelp32, // ç”¨äºŽè¿›ç¨‹æ“ä½œ
  ShellAPI, ComObj, ActiveX;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure KillTabTipProcess;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  hProcess: THandle;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if FSnapshotHandle <> INVALID_HANDLE_VALUE then
  begin
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    while ContinueLoop do
    begin
      if ('TabTip.exe' = string(FProcessEntry32.szExeFile)) then
      begin
        hProcess := OpenProcess(PROCESS_TERMINATE, False, FProcessEntry32.th32ProcessID);
        if hProcess <> 0 then
        begin
          TerminateProcess(hProcess, 0);
          CloseHandle(hProcess);
        end;
      end;
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
  end;
end;
procedure OpenTabTip;
var
  TabTipPath: string;
  Tip: OleVariant;
begin
  TabTipPath := 'C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe';
    Writeln('IsNewVisable show TabTip');
    CoInitialize(nil);
    try
      Tip := CreateComObject(CLSID_UIHostNoLaunch) as IDispatch;
      if VarIsClear(Tip) then
      begin
        Writeln('tip is nullptr');
        Exit;
      end;
      (Tip as ITipInvocation).Toggle(GetDesktopWindow); // æ˜¾ç¤ºè§¦æ‘¸é”®ç›˜
    finally
      CoUninitialize;
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTabTipProcess; // ç¡®ä¿æ²¡æœ‰æ®‹ç•™çš„TabTip进程
  //ShellExecute(0, nil, 'C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe', nil, nil, SW_SHOWNORMAL);
  OpenTabTip;
end;
end.
demo/TabTip1/OpenTabTip.exe
Binary files differ
demo/TabTip1/Project1.cfg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"d:\program files\borland\delphi7\Projects\Bpl"
-LN"d:\program files\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
demo/TabTip1/Project1.dof
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;dbrtl;vcldb;VclSmp;dbexpress;bdertl;vclie;adortl;vclactnband;vclshlctrls;dclOfficeXP;vcldbx;visualclx;visualdbclx;inet;xmlrtl;inetdbbde;inetdbxpress;IndyCore70;IndySystem70;IndyProtocols70;RaizeComponentsVcl;RaizeComponentsVclDb;
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=2052
CodePage=936
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
d:\program files\borland\delphi7\Bin\dclwbm70.bpl=Borland InternetExpress Components
d:\program files\borland\delphi7\Bin\dclindy70.bpl=Internet Direct (Indy) for D7 Property and Component Editors
D:\Program Files\Borland\Delphi7\Bin\dcltee70.bpl=TeeChart Components
d:\program files\borland\delphi7\Bin\dcldss70.bpl=Borland Decision Cube Components
d:\program files\borland\delphi7\Bin\DCLIB70.bpl=InterBase Data Access Components
d:\program files\borland\delphi7\Bin\dclmcn70.bpl=Borland DataSnap Connection Components
D:\Program Files\Borland\Delphi7\Bin\dclmid70.bpl=Borland MyBase DataAccess Components
d:\program files\borland\delphi7\Bin\dcldbxcds70.bpl=Borland SimpleDataset Component (DBX)
d:\program files\borland\delphi7\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package
d:\program files\borland\delphi7\Bin\dclsoap70.bpl=Borland SOAP Components
d:\program files\borland\delphi7\Bin\dclwebsnap70.bpl=Borland WebSnap Components
d:\program files\borland\delphi7\Bin\dclite70.bpl=Borland Integrated Translation Environment
C:\WINDOWS\SysWOW64\ibevnt70.bpl=Borland Interbase Event Alerter Component
demo/TabTip1/Project1.dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
demo/TabTip1/Project1.exe
Binary files differ
demo/TabTip1/Project1.res
Binary files differ
demo/TabTip1/TabTip.exe
Binary files differ
demo/TabTip1/Unit1.dcu
Binary files differ
demo/TabTip1/Unit1.ddp
Binary files differ
demo/TabTip1/Unit1.dfm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
object Form1: TForm1
  Left = 192
  Top = 131
  Width = 536
  Height = 348
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -21
  Font.Name = #24494#36719#38597#40657
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 28
  object Button1: TButton
    Left = 100
    Top = 130
    Width = 136
    Height = 56
    Caption = #21551#21160#25163#20889#26495
    TabOrder = 0
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 85
    Top = 60
    Width = 241
    Height = 36
    TabOrder = 1
  end
end
demo/TabTip1/Unit1.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TlHelp32, // ç”¨äºŽè¿›ç¨‹æ“ä½œ
  ShellAPI, ComObj, ActiveX;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure KillTabTipProcess;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  hProcess: THandle;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if FSnapshotHandle <> INVALID_HANDLE_VALUE then
  begin
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    while ContinueLoop do
    begin
      if ('TabTip.exe' = string(FProcessEntry32.szExeFile)) then
      begin
        hProcess := OpenProcess(PROCESS_TERMINATE, False, FProcessEntry32.th32ProcessID);
        if hProcess <> 0 then
        begin
          TerminateProcess(hProcess, 0);
          CloseHandle(hProcess);
        end;
      end;
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  //KillTabTipProcess; // ç¡®ä¿æ²¡æœ‰æ®‹ç•™çš„TabTip进程
  ShellExecute(0, nil, 'OpenTabTip', nil, nil, SW_SHOWNORMAL);
end;
end.
demo/TabletPC/TabletPC.cfg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"d:\program files\borland\delphi7\Projects\Bpl"
-LN"d:\program files\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
demo/TabletPC/TabletPC.dof
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;vgscene_d7;NexusDB207si70;NexusDB207se70;NexusDB207sr70;NexusDB207pv70;NexusDB207sq70;NexusDB207re70;NexusDB207tm70;NexusDB207ts70;NexusDB207tc70;NexusDB207tn70;NexusDB207tw70;NexusDB207db70;NexusDB207lg70;NexusDB207ch70;NexusDB207ll70;TRealMagic;TMSNPopUp;TPicShow;tmswizd7;TMSD7;tmsexd7;tmsxlsd7;TntUnicodeVcl_R70;TScrollText;GR32_D7;TGIFimage
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=C:\Program Files\Borland\Delphi7\Bin\
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=2052
CodePage=936
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
demo/TabletPC/TabletPC.dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
program TabletPC;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
demo/TabletPC/TabletPC.exe
Binary files differ
demo/TabletPC/TabletPC.res
Binary files differ
demo/TabletPC/Unit1.dcu
Binary files differ
demo/TabletPC/Unit1.ddp
Binary files differ
demo/TabletPC/Unit1.dfm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1487 @@
object Form1: TForm1
  Left = 469
  Top = 147
  Width = 1296
  Height = 772
  Caption = #24494#36719#25163#20889#28436#31034#31243#24207
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Icon.Data = {
    000001000700404000000100200028420000760000003030000001002000A825
    00009E4200002828000001002000681A0000466800002020000001002000A810
    0000AE820000181800000100200088090000569300001414000001002000B806
    0000DE9C000010100000010020006804000096A3000028000000400000008000
    0000010020000000000000420000000000000000000000000000000000000000
    000000000000000000010000000A0000001C00000032000000490000005E0000
    006B000000770000007C000000830000007E0000007000000061000000500000
    003D000000270000001600000007000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000B00000054000000B3000000BC0000006100000007000000000000
    00000000000700000053000000AF000000D4000000E9000000F3000000FB0000
    00FD000000FD000000FD000000FE000000FE000000FD000000FC000000F60000
    00EE000000E2000000CB000000A80000007A000000470000001F000000090000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    002500000094000000EE000000FF000000FF000000E70000003C000000000000
    000000000042000000E6000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000F2000000D7000000AA0000
    0066000000310000000F00000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000100000013000000620000
    00CE000000FB000000FF000000FF000000FF000000FC00000064000000000000
    000100000074000000FD000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FA000000E7000000BC00000079000000380000001100000002000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000001400000055000000B7000000F30000
    00FF000000FF000000FF000000FF000000FF000000E20000003A000000000000
    00000000004C000000EE000000FF000000FF000000FF000000FE000000FC0000
    00F7000000F4000000F2000000F1000000F3000000F6000000F9000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FC000000EA000000C00000007F000000420000
    001A000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000000A000000290000006E000000C0000000F2000000FF000000FF0000
    00FF000000FF000000FF000000FD000000D90000005E00000006000000000000
    00000000000B00000070000000C7000000C4000000A300000082000000680000
    00580000004B000000430000004200000047000000510000005F000000770000
    0091000000B5000000D1000000E9000000FA000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FC000000F00000
    00CF0000009B0000006A0000003B0000001D0000000E00000006000000010000
    0001000000010000000100000001000000020000000900000018000000320000
    0066000000A9000000DE000000F9000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F4000000A8000000340000000300000000000000000000
    0000000000000000000300000014000000120000000600000002000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    00040000000B0000001A00000033000000650000009D000000D2000000F00000
    00FD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FA000000ED000000D7000000BC000000A30000008D0000
    007E000000790000007A0000007F00000092000000AD000000CF000000E70000
    00F9000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FB000000D00000006400000012000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000001000000070000001B000000440000
    0087000000C6000000EE000000FD000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00FD000000FC000000FC000000FD000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FB000000D70000
    007E000000240000000200000000000000000000000000000000000000000000
    00000000000000000000000000030000002C0000004E0000002D000000060000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0003000000150000004000000080000000BB000000E6000000FA000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FE000000F3000000C700000079000000260000
    0004000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000003F000000D5000000F6000000DF0000008C0000
    002E000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000000F000000310000006D000000A80000
    00D6000000EF000000FB000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FD000000F1000000D50000009B000000510000001700000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000300000088000000FE000000FF000000FF000000FC0000
    00DD000000890000002E00000005000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000080000
    001E00000041000000710000009C000000C0000000D6000000E4000000EF0000
    00F4000000F5000000F5000000F3000000EC000000DF000000CC000000A90000
    007E000000470000001F00000006000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000081000000FD000000FF000000FF000000FF0000
    00FF000000FC000000DC00000083000000280000000300000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000050000000F0000001C0000002D000000390000
    0045000000480000004800000042000000350000002700000015000000080000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000035000000E4000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FB000000D6000000730000001D000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000800000097000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F9000000C8000000680000
    0018000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000037000000E3000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F60000
    00C0000000540000000E00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000600000093000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F0000000AD00000045000000090000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000034000000E2000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000EA000000950000002F00000004000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000060000008D000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000DB000000720000001A0000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000002D000000DB0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F8000000BC0000
    0043000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000005000000850000
    00FB000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00E30000006C0000000B00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000290000
    00D8000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EF000000780000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    007F000000FB000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EF000000780000000B0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0023000000D0000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EF000000780000000B00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00020000006A000000F6000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EF000000780000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000017000000BE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000EF000000790000000C0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000054000000F0000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F0000000790000
    000B000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000D000000A4000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EF0000
    00770000000B0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000037000000DF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EF000000780000000B00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000050000007B000000F8000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EF000000780000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000019000000BA000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EF000000780000000B0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000039000000D7000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EF000000780000000B00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000030000004E000000DD0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EF000000780000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000030000004E0000
    00DD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000EF0000006F000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000030000
    004F000000DD000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000ED0000006B0000
    0007000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000300000052000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EC0000
    006A000000070000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000006A0000000700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EC0000006A00000007000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EC0000006A000000070000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EC0000006A0000000700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000E10000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EC0000006A00000007000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000530000
    00E1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000ED0000006B000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    0054000000E1000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000ED0000006B0000
    0007000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000400000054000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EC0000
    006A000000070000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000006A0000000700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EC0000006800000005000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F9000000930000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F90000009F0000001900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000E10000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F90000
    009F0000001A0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000530000
    00E1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F90000009F0000
    001900000000000000000000000000000000000000130000003A000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    0054000000E1000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F90000009F0000001A0000
    00000000000000000000000000000000001300000093000000E1000000650000
    0006000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000400000054000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F90000009F00000019000000000000
    000000000000000000000000001300000093000000F7000000FF000000E90000
    005E000000040000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F90000009F0000001A00000000000000000000
    0000000000000000001300000093000000F7000000FF000000FF000000FF0000
    00DC000000360000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000F90000009F0000001A0000000000000000000000000000
    00000000001300000093000000F7000000FF000000FF000000FF000000FF0000
    00FD000000A10000000A00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000F90000009F0000001A000000000000000000000000000000000000
    001300000093000000F7000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E40000002E00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00F90000009F0000001900000000000000000000000000000000000000120000
    0091000000F7000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000005700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000DB0000
    009F0000001A00000000000000000000000000000000000000110000008B0000
    00F5000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FB0000006700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000330000
    001700000000000000000000000000000000000000120000008C000000F50000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000005C00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000120000008C000000F5000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E50000003100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000120000008C000000F5000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FC0000009B0000000900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000050000007C000000F5000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FC0000
    00BD000000260000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000052000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000C10000
    0030000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000DE000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000C1000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000300000044000000BE000000F70000
    00FF000000FF000000FF000000FF000000F8000000B700000031000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000001000000180000005C0000
    00A2000000C5000000C9000000B00000006D0000001A00000001000000000000
    000000000000000000000000000000000000000000000000000000000000C000
    07FFFFFFFF818000007FFFFFFE018000000FFFFFF80100000001FFFFE0018000
    00003FFF00018000000000000003C1FE00000000000FFFFFF0000000001FE0FF
    FF000000007FE03FFFE0000001FFC00FFFFC00000FFFC003FFFFE0007FFFE000
    FFFFFFFFFFFFE0003FFFFFFFFFFFF0001FFFFFFFFFFFF00007FFFFFFFFFFF800
    01FFFFFFFFFFF800007FFFFFFFFFFC00003FFFFFFFFFFC00001FFFFFFFFFFE00
    000FFFFFFFFFFE000007FFFFFFFFFF000003FFFFFFFFFF000001FFFFFFFFFF80
    0000FFFFFFFFFF8000007FFFFFFFFFC000003FFFFFFFFFE000001FFFFFFFFFE0
    00000FFFFFFFFFF0000007FFFFFFFFF8000003FFFFFFFFF8000001FFFFFFFFFC
    000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFFFF
    C000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFFF
    FC000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFF
    FFC000000FFFFFFFFFE000000FFFFFFFFFF000001FFFFFFFFFF800003FFFFFFF
    FFFC000078FFFFFFFFFE0000F07FFFFFFFFF0001E03FFFFFFFFF8003C03FFFFF
    FFFFC007801FFFFFFFFFE00F001FFFFFFFFFF01E001FFFFFFFFFF83C001FFFFF
    FFFFFC78001FFFFFFFFFFFF0001FFFFFFFFFFFE0001FFFFFFFFFFFC0003FFFFF
    FFFFFFC0003FFFFFFFFFFFE0007FFFFFFFFFFFF000FFFFFFFFFFFFF801FF2800
    0000300000006000000001002000000000008025000000000000000000000000
    00000000000000000000000000040000002300000044000000640000007F0000
    008E000000970000009D000000980000008B000000790000005F000000430000
    0027000000100000000200000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000700000049000000B3000000BB0000
    0042000000010000000200000061000000D9000000F3000000FB000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FE000000FB000000F30000
    00E2000000C20000008E00000055000000230000000900000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000020000002200000088000000E9000000FF000000FF0000
    00AE000000080000000E000000C0000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000F7000000DC000000AD000000680000002C0000
    000B000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00030000001D0000006C000000CE000000FB000000FF000000FF000000FC0000
    0099000000060000000600000091000000F8000000FA000000F1000000E50000
    00DB000000D3000000D0000000D4000000DB000000E8000000F2000000FB0000
    00FE000000FF000000FF000000FF000000FF000000FF000000FB000000E30000
    00B2000000710000003900000015000000050000000100000000000000000000
    0000000000000000000000000000000000000000000200000011000000390000
    0082000000D0000000F9000000FF000000FF000000FF000000F4000000A50000
    00240000000000000000000000160000005D0000005E0000003E0000002A0000
    001F000000180000001600000019000000200000002D00000042000000630000
    008D000000C0000000E6000000FA000000FF000000FF000000FF000000FF0000
    00FF000000FC000000EC000000CD000000A200000074000000520000003C0000
    0031000000300000003200000040000000600000008C000000C1000000EB0000
    00FD000000FF000000FF000000FF000000FC000000D5000000670000000F0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0002000000100000002F00000063000000A9000000DE000000F8000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000F8000000F10000
    00EA000000E9000000EB000000F2000000FA000000FF000000FF000000FF0000
    00FF000000FF000000FD000000DF0000008B0000002800000002000000000000
    00000000000000000000000000000000000B0000005600000067000000240000
    0003000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000008000000260000005D0000009D0000
    00D4000000F3000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00F4000000CD000000810000002E000000050000000000000000000000000000
    000000000000000000000000000000000053000000F0000000FA000000D60000
    0079000000230000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000050000
    001C000000480000007F000000B2000000D7000000EC000000F6000000FB0000
    00FE000000FE000000FE000000FA000000F3000000E2000000C5000000900000
    004E000000190000000300000000000000000000000000000000000000000000
    000000000000000000000000000000000066000000FB000000FF000000FF0000
    00FB000000D4000000760000001F000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000020000000A0000001C000000340000004C000000600000
    006E000000700000006C0000005C000000440000002800000011000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000029000000DB000000FF000000FF0000
    00FF000000FF000000FA000000CD000000660000001600000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000084000000FC000000FF0000
    00FF000000FF000000FF000000FF000000F7000000C20000005A0000000F0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000028000000DA000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F3000000B10000
    0047000000090000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000081000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000009A0000003000000003000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000025000000D50000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FD000000DC00000075000000150000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000003000000780000
    00FA000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F8000000B10000002D00000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000200000
    00D1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000C500000031000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    006F000000F8000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FE000000C5000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0019000000C4000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FE000000C50000
    0031000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000100000059000000F3000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FD0000
    00C5000000310000000100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000F000000AD000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FE000000C50000003000000001000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000003E000000E6000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FE000000C500000031000000010000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000600000085000000FB000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000C5000000310000000100000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001C000000BC000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FE000000C50000003100000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000100000033000000CC000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FE000000C500000030000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000100000037000000CD000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000C2000000290000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000100000037000000CF0000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000BE0000
    0029000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000003A0000
    00D0000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FD0000
    00BE000000290000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    003A000000D0000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FD000000BE0000002900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000003A000000D1000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FD000000BE00000029000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000003A000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FD000000BE000000290000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000003B000000D0000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FD000000BE0000002900000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000003A000000D0000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000BE00000029000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000003A000000D0000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000BE000000290000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000003A000000D00000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000B90000
    0019000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000003A0000
    00D1000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F8000000970000
    0011000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    003A000000D0000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F800000098000000150000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000003B000000D0000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F80000009800000014000000000000
    0000000000060000004A00000024000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000003A000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F8000000980000001400000000000000000000
    000600000065000000E8000000BA000000240000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000003A000000D0000000FE000000FF000000FF0000
    00FF000000FF000000F800000098000000140000000000000000000000060000
    0065000000EA000000FF000000FD000000A80000001000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000003A000000D0000000FE000000FF0000
    00FF000000F80000009800000015000000000000000000000006000000650000
    00EA000000FF000000FF000000FF000000F40000005700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000003A000000D1000000FE0000
    00F8000000980000001500000000000000000000000600000065000000EA0000
    00FF000000FF000000FF000000FF000000FF000000A200000005000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000003A000000CA0000
    00970000001500000000000000000000000600000061000000E9000000FF0000
    00FF000000FF000000FF000000FF000000FF000000BC0000000C000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000220000
    001100000000000000000000000600000061000000E8000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000B000000009000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000600000061000000E8000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F90000006D00000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000050000000E7000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FC000000AE0000001700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000036000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FC000000B3000000230000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000100000038000000C3000000FA000000FF000000FF0000
    00FF000000FA000000B100000023000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000001E00000073000000B8000000CF0000
    00C10000007C0000001B00000000000000000000000000000000000000000000
    00000000000080007FFFFFC0000000000FFFFF000000000000FFFC0000000000
    000FE00100008000000000030000FFFC000000070000C1FFC000001F0000C07F
    F800007F0000C01FFF0003FF0000C007FFFFFFFF0000C003FFFFFFFF0000E000
    FFFFFFFF0000E0003FFFFFFF0000F0001FFFFFFF0000F00007FFFFFF0000F800
    03FFFFFF0000F80001FFFFFF0000FC0000FFFFFF0000FC00007FFFFF0000FE00
    003FFFFF0000FF00001FFFFF0000FF00000FFFFF0000FF800007FFFF0000FF80
    0003FFFF0000FFC00003FFFF0000FFE00001FFFF0000FFF00000FFFF0000FFF8
    00007FFF0000FFFC00003FFF0000FFFE00001FFF0000FFFF00000FFF0000FFFF
    800007FF0000FFFFC00003FF0000FFFFE00001FF0000FFFFF00001FF0000FFFF
    F80003FF0000FFFFFC00063F0000FFFFFE000C1F0000FFFFFF00180F0000FFFF
    FF80300F0000FFFFFFC060070000FFFFFFE0C0070000FFFFFFF180070000FFFF
    FFFF00070000FFFFFFFE000F0000FFFFFFFF001F0000FFFFFFFF003F0000FFFF
    FFFF807F00002800000028000000500000000100200000000000401A00000000
    000000000000000000000000000000000000000000190000004D000000730000
    0090000000A0000000A7000000A90000009F0000008F00000075000000540000
    0032000000140000000400000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000190000
    007E000000C7000000790000000700000012000000AF000000F6000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FE000000F90000
    00E9000000CA0000009700000056000000250000000700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000C0000004C000000BE0000
    00FA000000FF000000D60000001B0000001E000000D7000000FF000000FF0000
    00FD000000F9000000F7000000F7000000F9000000FD000000FE000000FF0000
    00FF000000FF000000FF000000F8000000DE000000A8000000620000002A0000
    000C000000010000000000000000000000000000000000000000000000000000
    00000000000000000003000000160000004F000000AB000000EF000000FF0000
    00FF000000F40000008D00000009000000040000005A000000A2000000870000
    0067000000550000004B0000004B000000540000006700000085000000AA0000
    00CF000000EE000000FD000000FF000000FF000000FF000000FA000000E30000
    00B80000008200000051000000310000002000000019000000180000001C0000
    002E0000004F0000008A000000CA000000F3000000FF000000FF000000FD0000
    00D7000000660000000E00000000000000000000000100000004000000020000
    0000000000000000000000000000000000000000000000000001000000060000
    00170000003C00000075000000B8000000E7000000FC000000FF000000FF0000
    00FF000000FE000000F8000000EA000000DD000000D4000000D3000000D90000
    00E7000000F7000000FE000000FF000000FF000000FD000000E3000000910000
    002A00000002000000000000000000000000000000010000003E000000800000
    00420000000A0000000000000000000000000000000000000000000000000000
    000000000000000000010000000D000000310000006B000000AC000000DE0000
    00F6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000F3000000CE0000008400000032000000060000
    0000000000000000000000000000000000000000000E000000BC000000FE0000
    00EC000000A50000004100000009000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000008000000240000
    004E00000080000000AC000000C9000000D9000000E1000000E2000000DC0000
    00CD000000B00000008200000048000000190000000300000000000000000000
    00000000000000000000000000000000000000000009000000A8000000FF0000
    00FF000000FE000000EB0000009F000000370000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000007000000110000001C00000024000000250000001F0000
    0014000000080000000100000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000004A000000EF0000
    00FF000000FF000000FF000000FE000000E4000000900000002E000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000C000000AC0000
    00FF000000FF000000FF000000FF000000FF000000FD000000DD0000007E0000
    0020000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000470000
    00EE000000FF000000FF000000FF000000FF000000FF000000FF000000FB0000
    00CE000000630000001100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000B0000
    00A5000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F5000000B000000037000000030000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0040000000EA000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000DB000000510000000300000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00090000009E000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000E10000005200000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000036000000E3000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000E100000052000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000500000089000000FC000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000E1000000520000
    0003000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000024000000D3000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000E10000
    0052000000030000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000065000000F5000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00E1000000520000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000010000000A8000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E10000005200000003000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000027000000C1000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000E100000052000000030000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000002D000000C2000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000DF0000004B0000000200000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000002D000000C50000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000DD0000004A00000002000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000DD0000004A000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    002F000000C6000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000DD0000004A0000
    0002000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000002F000000C6000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000DD0000
    004A000000020000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000002F000000C6000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00DD0000004A0000000200000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000002F000000C6000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000DD0000004A00000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000002F000000C6000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000DD00000049000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000002F000000C6000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F800000080000000040000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000002F000000C60000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000009400000013000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F800000094000000130000000000000003000000450000003F000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    002F000000C6000000FE000000FF000000FF000000FF000000FF000000F80000
    00940000001300000000000000030000004F000000DF000000DA000000410000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000002F000000C6000000FE000000FF000000FF000000F8000000940000
    001300000000000000030000004F000000E0000000FF000000FF000000C20000
    0018000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000002F000000C6000000FE000000F800000094000000130000
    0000000000030000004F000000E0000000FF000000FF000000FF000000F70000
    0055000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000002F000000BF0000009300000013000000000000
    00030000004C000000DE000000FF000000FF000000FF000000FF000000FE0000
    007A000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000001B0000000F00000000000000030000
    004C000000DD000000FF000000FF000000FF000000FF000000FF000000FC0000
    006C000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000030000004C0000
    00DD000000FF000000FF000000FF000000FF000000FF000000FF000000DB0000
    002D000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000D000000AA0000
    00FE000000FF000000FF000000FF000000FF000000FF000000E5000000590000
    0003000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C0000000FC000000FF000000FF000000FF000000E40000005B000000050000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    001F0000007E000000C2000000D1000000B00000004900000005000000000000
    00000000000000000000000000008001FFFFC000000000003FFF800000000000
    03FC0000000000000000010000008FC000000300000083FC00000F00000080FF
    C0003F000000803FF801FF000000C00FFFFFFF000000C003FFFFFF000000E001
    FFFFFF000000E0007FFFFF000000F0003FFFFF000000F0001FFFFF000000F800
    0FFFFF000000F80007FFFF000000FC0003FFFF000000FC0001FFFF000000FE00
    00FFFF000000FF00007FFF000000FF00003FFF000000FF80001FFF000000FFC0
    000FFF000000FFE00007FF000000FFF00003FF000000FFF80001FF000000FFFC
    0000FF000000FFFE00007F000000FFFF00007F000000FFFF8000FF000000FFFF
    C0010F000000FFFFE00207000000FFFFF00407000000FFFFF80807000000FFFF
    FC1003000000FFFFFE2007000000FFFFFFC007000000FFFFFFC007000000FFFF
    FFC00F000000FFFFFFE01F000000280000002000000040000000010020000000
    0000801000000000000000000000000000000000000000000007000000480000
    0081000000A1000000B0000000B6000000B3000000A50000008B000000660000
    003B000000180000000400000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000050000003E000000B0000000AD0000001B00000035000000E70000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FC0000
    00EF000000D10000009A00000057000000210000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000050000
    002900000086000000E5000000FE000000E50000003000000020000000B60000
    00CC000000B3000000A1000000990000009E000000AE000000C6000000DF0000
    00F5000000FE000000FF000000F8000000DB000000A500000066000000360000
    001A0000000C00000008000000080000000E000000220000004E000000980000
    00DE000000FC000000FD000000D8000000600000000700000001000000100000
    0015000000080000000400000002000000030000000600000010000000230000
    004B00000088000000C7000000EF000000FD000000FF000000FB000000ED0000
    00D5000000C1000000B4000000B5000000C4000000DE000000F5000000FE0000
    00FE000000E7000000970000002C0000000200000000000000000000001A0000
    0087000000690000001A00000001000000000000000000000000000000000000
    000000000002000000120000003C0000007A000000BA000000E2000000F70000
    00FE000000FF000000FF000000FF000000FF000000FC000000F0000000CD0000
    0087000000350000000700000000000000000000000000000000000000470000
    00F4000000F9000000CA00000068000000170000000100000000000000000000
    0000000000000000000000000000000000010000000C000000270000004C0000
    00720000008D0000009B0000009A00000089000000670000003D000000170000
    00030000000000000000000000000000000000000000000000000000001D0000
    00D0000000FF000000FF000000F8000000C30000005A00000011000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000000200000002000000010000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    0070000000FA000000FF000000FF000000FF000000F5000000B6000000490000
    000A000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001C000000CD000000FF000000FF000000FF000000FF000000FF000000EF0000
    009F000000310000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000100000069000000F8000000FF000000FF000000FF000000FF000000FF0000
    00FE000000DE000000690000000A000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000018000000C7000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F20000007B0000000A0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000005F000000F5000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F20000007B0000000A00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000011000000B6000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F30000007B0000000A000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000046000000EB000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F20000007B0000000A0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000070000008E000000FB000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F20000007B0000
    000A000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001C000000B5000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F20000
    007B0000000A0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000023000000B7000000FD0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F2000000760000000800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000024000000BA0000
    00FD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F10000007400000008000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000250000
    00BA000000FD000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F100000074000000080000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0025000000BA000000FD000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F1000000740000000800000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000025000000BA000000FD000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F10000007500000008000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000025000000BA000000FD000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F100000074000000080000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000025000000BA000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000E9000000420000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000025000000BA000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F700000090000000100000
    0000000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000025000000BA000000FD0000
    00FF000000FF000000FF000000FF000000F70000009000000010000000010000
    00390000005D0000000800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000025000000BA0000
    00FD000000FF000000FF000000F70000009000000010000000010000003B0000
    00D2000000EF0000006100000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000250000
    00BA000000FD000000F70000009000000010000000010000003B000000D20000
    00FE000000FF000000D00000001B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0025000000B40000008F000000100000000100000039000000D1000000FE0000
    00FF000000FF000000F000000039000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000150000000D0000000100000039000000D0000000FE000000FF0000
    00FF000000FF000000E80000002F000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000002A000000CE000000FE000000FF000000FF0000
    00FF000000FA000000970000000A000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001F000000B8000000FC000000FF000000FF0000
    00FA000000A40000001800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001E00000088000000CB000000CE0000
    008900000018000000000000000000000000000000000007FFE00000FF800000
    00000000000183E0000780FC001F807FE1FF801FFFFFC007FFFFC003FFFFE001
    FFFFE000FFFFF0007FFFF8003FFFF8001FFFFC000FFFFE0007FFFF0003FFFF80
    01FFFFC000FFFFE0007FFFF0003FFFF8003FFFFC002FFFFE0007FFFF0003FFFF
    8003FFFFC003FFFFE003FFFFF803FFFFF807FFFFFC0F28000000180000003000
    0000010020000000000060090000000000000000000000000000000000000000
    002200000088000000B0000000BE000000C1000000B70000009F000000760000
    0043000000190000000400000000000000000000000000000000000000000000
    00000000000000000000000000010000001500000073000000C4000000400000
    0056000000EC000000E7000000DC000000DA000000E1000000EF000000F90000
    00F2000000D30000009800000052000000230000000B00000002000000010000
    0001000000080000002200000062000000C1000000F7000000D5000000370000
    000D000000390000002D0000001E0000001C00000023000000370000005D0000
    009A000000D3000000F4000000F7000000DE000000BB0000009B0000008C0000
    0093000000B2000000DC000000F8000000E90000009B0000002C000000020000
    0002000000660000008F00000035000000060000000000000000000000000000
    00040000001A000000490000008A000000C1000000E0000000EF000000F40000
    00F2000000E6000000C700000089000000390000000800000000000000000000
    000300000093000000FD000000E6000000920000002D00000004000000000000
    00000000000000000000000000020000000E0000002300000037000000410000
    003D0000002A0000001100000002000000000000000000000000000000000000
    000000000039000000E8000000FF000000FD000000DF00000082000000220000
    0002000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000700000099000000FE000000FF000000FF000000FC000000D20000
    00650000000F0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000035000000E5000000FF000000FF000000FF000000FF0000
    00F60000009F0000001800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000050000008E000000FD000000FF000000FF000000FF0000
    00FF000000FB000000A500000018000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000029000000DA000000FF000000FF000000FF0000
    00FF000000FF000000FB000000A5000000190000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000006F000000F8000000FF000000FF0000
    00FF000000FF000000FF000000FB000000A50000001800000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000012000000A5000000FC000000FF0000
    00FF000000FF000000FF000000FF000000FB000000A500000018000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000001B000000AB000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FB000000A1000000160000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000001C000000AD0000
    00FC000000FF000000FF000000FF000000FF000000FF000000FA000000A00000
    0016000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000001C0000
    00AD000000FC000000FF000000FF000000FF000000FF000000FF000000FA0000
    00A0000000160000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001C000000AD000000FC000000FF000000FF000000FF000000FF000000FF0000
    00FA000000A00000001600000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000001C000000AD000000FC000000FF000000FF000000FF000000FF0000
    00FF000000FA0000009B0000000C000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000001C000000AD000000FC000000FF000000FF000000FF0000
    00FF000000F7000000890000000A000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001C000000AD000000FC000000FF000000FF0000
    00F70000008C0000000F0000002A000000770000001400000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001C000000AD000000FC000000F70000
    008C0000000F0000002A000000C1000000F80000007E00000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000001C000000A60000008A0000
    000F00000029000000C1000000FE000000FF000000C700000010000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000100000000B0000
    0029000000BF000000FD000000FF000000FF000000B70000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000030000
    0081000000FA000000FF000000FF000000DD0000004500000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001B0000008F000000D1000000BE00000046000000020000000000000000001F
    E00000000000000000000700030001E00F00807FFF00803FFF00C01FFF00C00F
    FF00E007FF00E003FF00F001FF00F800FF00FC007F00FE003F00FF001F00FF80
    0F00FFC00700FFE00300FFF00100FFF80100FFFC0100FFFE0100FFFF03002800
    0000140000002800000001002000000000009006000000000000000000000000
    0000000000000000003B000000A5000000C0000000C7000000C0000000A90000
    007E000000450000001900000003000000000000000000000000000000000000
    0000000000000000000C00000053000000BD0000005700000053000000BD0000
    00A90000009F000000A8000000C1000000E0000000EC000000D2000000970000
    00570000002F0000001E0000001C0000002E00000060000000B2000000EC0000
    00BF00000031000000070000003F0000002500000005000000040000000D0000
    0024000000560000009C000000D4000000EC000000E8000000DD000000DB0000
    00E7000000EB000000C70000006E000000180000000000000010000000C00000
    00D5000000760000001D000000010000000000000000000000040000001A0000
    003F000000660000007D0000007F000000680000003D00000013000000010000
    000000000000000000030000007D000000FC000000FB000000CE000000670000
    0014000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000230000
    00D6000000FF000000FF000000F8000000BD0000004800000005000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000200000076000000FB000000FF000000FF0000
    00FF000000E90000006700000006000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001D000000CC000000FF000000FF000000FF000000FF000000EC000000670000
    0006000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000005F000000F5000000FF0000
    00FF000000FF000000FF000000EC000000670000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000D0000009C000000FB000000FF000000FF000000FF000000FF0000
    00EC000000670000000600000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000018000000A50000
    00FB000000FF000000FF000000FF000000FF000000EC00000064000000050000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000018000000A6000000FB000000FF000000FF0000
    00FF000000FF000000EB00000063000000050000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0019000000A6000000FB000000FF000000FF000000FF000000FF000000EB0000
    0063000000050000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000019000000A6000000FB0000
    00FF000000FF000000FF000000FF000000EB0000006000000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000019000000A6000000FB000000FF000000FF000000FF0000
    00F70000007F0000000700000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000190000
    00A6000000FB000000FF000000F70000008A000000130000005E000000580000
    0003000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000019000000A6000000F30000008A0000
    001300000066000000EC000000DD000000270000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000018000000590000001300000064000000EC000000FF000000F30000
    0040000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000410000
    00E8000000FF000000FD000000B8000000170000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001700000090000000D3000000AA000000260000
    000000000000003F000000000000000010000300300001FFF000807FF000803F
    F000C01FF000C00FF000E007F000F003F000F801F000FC00F000FE007000FF00
    3000FF801000FFC01000FFE01000FFF81000FFF8300028000000100000002000
    0000010020000000000040040000000000000000000000000000000000000000
    0058000000BB000000C6000000C4000000B20000008300000046000000180000
    0004000000000000000000000000000000090000003B000000A7000000690000
    003D0000006F000000560000005A00000078000000AC000000D2000000CB0000
    009D000000710000006200000076000000AF000000D70000009E000000250000
    0021000000A00000005A00000011000000010000000700000023000000570000
    0091000000B6000000BF000000B2000000830000003B00000009000000000000
    0014000000C2000000F5000000B90000004D0000000B00000000000000000000
    0002000000080000000C00000007000000010000000000000000000000000000
    00010000005C000000F6000000FF000000F0000000A20000002A000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000012000000BC000000FF000000FF000000FE000000C9000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000004E000000F0000000FF000000FF000000FE000000CA0000
    0031000000010000000000000000000000000000000000000000000000000000
    0000000000000000000900000091000000FA000000FF000000FF000000FE0000
    00C9000000310000000100000000000000000000000000000000000000000000
    00000000000000000000000000140000009E000000FA000000FF000000FF0000
    00FE000000C80000002F00000001000000000000000000000000000000000000
    0000000000000000000000000000000000150000009F000000FA000000FF0000
    00FF000000FE000000C70000002F000000010000000000000000000000000000
    000000000000000000000000000000000000000000150000009F000000FA0000
    00FF000000FF000000FE000000C70000002E0000000000000000000000000000
    00000000000000000000000000000000000000000000000000150000009F0000
    00FA000000FF000000FF000000F50000006A0000000500000000000000000000
    0000000000000000000000000000000000000000000000000000000000150000
    009F000000FA000000F600000088000000290000008500000026000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0015000000990000008500000029000000AD000000FB00000080000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000B0000001B000000A8000000FC000000F80000006C000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000F0000008E000000D30000008A00000010000000000070
    000000000000000100000307000000FF0000807F0000C03F0000C01F0000E00F
    0000F0070000F8070000FC030000FE010000FF010000FF810000FFC10000}
  OldCreateOrder = False
  OnCreate = FormCreate
  DesignSize = (
    1280
    733)
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 936
    Height = 726
    Anchors = [akLeft, akTop, akRight, akBottom]
    BevelOuter = bvNone
    Caption = #25163#20889#21306
    TabOrder = 0
    DesignSize = (
      936
      726)
    object Edit1: TEdit
      Left = 625
      Top = 13
      Width = 311
      Height = 34
      Anchors = [akTop, akRight]
      BorderStyle = bsNone
      Color = clBtnFace
      Ctl3D = False
      Font.Charset = ANSI_CHARSET
      Font.Color = clWindowText
      Font.Height = -21
      Font.Name = #24494#36719#38597#40657
      Font.Style = []
      ParentCtl3D = False
      ParentFont = False
      TabOrder = 0
    end
  end
  object Button1: TButton
    Left = 955
    Top = 70
    Width = 116
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #28165#31354#25163#20889#21306
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 1
    OnClick = Button1Click
  end
  object edtName: TEdit
    Left = 950
    Top = 13
    Width = 311
    Height = 36
    Anchors = [akTop, akRight]
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -21
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 2
  end
  object Button2: TButton
    Left = 955
    Top = 150
    Width = 149
    Height = 96
    Anchors = [akTop, akRight]
    Caption = #21024#38500#31508#30011
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -29
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 3
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 1085
    Top = 70
    Width = 86
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #30830'  '#35748
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 4
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 1180
    Top = 70
    Width = 86
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #21024'  '#38500
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 5
    OnClick = Button4Click
  end
  object InkCLT: TInkCollector
    AutoConnect = True
    ConnectKind = ckRunningOrNew
    OnStroke = InkCLTStroke
    Left = 69
    Top = 25
  end
  object InkRC: TInkRecognizerContext
    AutoConnect = False
    ConnectKind = ckRunningOrNew
    Left = 116
    Top = 25
  end
end
demo/TabletPC/Unit1.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, MSINKAUTLib_TLB, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    InkCLT: TInkCollector;
    InkRC: TInkRecognizerContext;
    Panel1: TPanel;
    Button1: TButton;
    edtName: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure InkCLTStroke(ASender: TObject; const Cursor: IInkCursor;
      const Stroke: IInkStrokeDisp; var Cancel: WordBool);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    procedure InitializeInkCollector;
    function  DeleteStr(str :WideString):WideString;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
//------- è‡ªå®šä¹‰å‡½æ•° ------------------------------
//初始化InkCLT
procedure TForm1.InitializeInkCollector;
begin
  InkCLT.hWnd := panel1.Handle;
  InkCLT.Enabled := true;
  InkCLT.DefaultDrawingAttributes.Color := clRed; // å¢¨æ°´é¢œè‰²
  InkCLT.DefaultDrawingAttributes.Width := 200; // ç¬”的宽度
end;
function TForm1.DeleteStr(str :WideString):WideString;
var
  LengthOfText: Integer;
begin
  LengthOfText := Length(str);
  if LengthOfText > 0 then
  begin
    // åˆ é™¤æœ€åŽä¸€ä¸ªå­—符
    Delete(str, LengthOfText, 1);
  end;
  Result := str;
end;
//-------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  InitializeInkCollector;
end;
procedure TForm1.InkCLTStroke(ASender: TObject; const Cursor: IInkCursor;
  const Stroke: IInkStrokeDisp; var Cancel: WordBool);
//var
//  ActiveCtrl: TWinControl;
begin
  //返回当前拥有焦点的控件
  //ActiveCtrl := Screen.ActiveControl;
  //if ActiveCtrl is TEdit then
  //  TEdit(ActiveCtrl).Text := TEdit(ActiveCtrl).Text + Stroke.Ink.Strokes.ToString
  //else if ActiveCtrl is TMemo then
  //  TMemo(ActiveCtrl).Lines.Add(Stroke.Ink.Strokes.ToString);
    Edit1.Text := Stroke.Ink.Strokes.ToString;
  //else
  //  ShowMessage('提示:当前焦点不在编辑框或多行编辑框上.');
end;
//清空手写区
procedure TForm1.Button1Click(Sender: TObject);
begin
  InkCLT.Ink.DeleteStrokes(InkCLT.Ink.Strokes);
  Edit1.Clear;
  Panel1.Refresh;
end;
//删除一个字,要统计每个字有多少壁画,Ink只能追踪笔画,按笔画来删除!!!
procedure TForm1.Button2Click(Sender: TObject);
var
  Strokes: IInkStrokes;
  LastStroke: IInkStrokeDisp;
begin
  //Edit1.Text := DeleteStr(Edit1.Text);
  if InkCLT.Ink.Strokes.Count > 0 then
  begin
    Strokes := InkCLT.Ink.Strokes;
    LastStroke := Strokes.Item(Strokes.Count - 1) as IInkStrokeDisp;
    InkCLT.Ink.DeleteStroke(LastStroke);
  end;
end;
//确认备选字
procedure TForm1.Button3Click(Sender: TObject);
begin
  edtName.Text := edtName.Text + Trim(Edit1.Text);
  Button1Click(Sender);
end;
//删除Edit1的一个字
procedure TForm1.Button4Click(Sender: TObject);
begin
  edtName.Text := DeleteStr(edtName.Text);
end;
end.
demo/TabletPC/Unit1.~ddp
Binary files differ
demo/TabletPC/Unit1.~dfm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1487 @@
object Form1: TForm1
  Left = 195
  Top = 140
  Width = 1296
  Height = 772
  Caption = #24494#36719#25163#20889#28436#31034#31243#24207
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Icon.Data = {
    000001000700404000000100200028420000760000003030000001002000A825
    00009E4200002828000001002000681A0000466800002020000001002000A810
    0000AE820000181800000100200088090000569300001414000001002000B806
    0000DE9C000010100000010020006804000096A3000028000000400000008000
    0000010020000000000000420000000000000000000000000000000000000000
    000000000000000000010000000A0000001C00000032000000490000005E0000
    006B000000770000007C000000830000007E0000007000000061000000500000
    003D000000270000001600000007000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000B00000054000000B3000000BC0000006100000007000000000000
    00000000000700000053000000AF000000D4000000E9000000F3000000FB0000
    00FD000000FD000000FD000000FE000000FE000000FD000000FC000000F60000
    00EE000000E2000000CB000000A80000007A000000470000001F000000090000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    002500000094000000EE000000FF000000FF000000E70000003C000000000000
    000000000042000000E6000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000F2000000D7000000AA0000
    0066000000310000000F00000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000100000013000000620000
    00CE000000FB000000FF000000FF000000FF000000FC00000064000000000000
    000100000074000000FD000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FA000000E7000000BC00000079000000380000001100000002000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000001400000055000000B7000000F30000
    00FF000000FF000000FF000000FF000000FF000000E20000003A000000000000
    00000000004C000000EE000000FF000000FF000000FF000000FE000000FC0000
    00F7000000F4000000F2000000F1000000F3000000F6000000F9000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FC000000EA000000C00000007F000000420000
    001A000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000000A000000290000006E000000C0000000F2000000FF000000FF0000
    00FF000000FF000000FF000000FD000000D90000005E00000006000000000000
    00000000000B00000070000000C7000000C4000000A300000082000000680000
    00580000004B000000430000004200000047000000510000005F000000770000
    0091000000B5000000D1000000E9000000FA000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FC000000F00000
    00CF0000009B0000006A0000003B0000001D0000000E00000006000000010000
    0001000000010000000100000001000000020000000900000018000000320000
    0066000000A9000000DE000000F9000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F4000000A8000000340000000300000000000000000000
    0000000000000000000300000014000000120000000600000002000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    00040000000B0000001A00000033000000650000009D000000D2000000F00000
    00FD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FA000000ED000000D7000000BC000000A30000008D0000
    007E000000790000007A0000007F00000092000000AD000000CF000000E70000
    00F9000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FB000000D00000006400000012000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000001000000070000001B000000440000
    0087000000C6000000EE000000FD000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00FD000000FC000000FC000000FD000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FB000000D70000
    007E000000240000000200000000000000000000000000000000000000000000
    00000000000000000000000000030000002C0000004E0000002D000000060000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0003000000150000004000000080000000BB000000E6000000FA000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FE000000F3000000C700000079000000260000
    0004000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000003F000000D5000000F6000000DF0000008C0000
    002E000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000000F000000310000006D000000A80000
    00D6000000EF000000FB000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FD000000F1000000D50000009B000000510000001700000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000300000088000000FE000000FF000000FF000000FC0000
    00DD000000890000002E00000005000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000080000
    001E00000041000000710000009C000000C0000000D6000000E4000000EF0000
    00F4000000F5000000F5000000F3000000EC000000DF000000CC000000A90000
    007E000000470000001F00000006000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000081000000FD000000FF000000FF000000FF0000
    00FF000000FC000000DC00000083000000280000000300000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000050000000F0000001C0000002D000000390000
    0045000000480000004800000042000000350000002700000015000000080000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000035000000E4000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FB000000D6000000730000001D000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000800000097000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F9000000C8000000680000
    0018000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000037000000E3000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F60000
    00C0000000540000000E00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000600000093000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F0000000AD00000045000000090000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000034000000E2000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000EA000000950000002F00000004000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000060000008D000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000DB000000720000001A0000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000002D000000DB0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F8000000BC0000
    0043000000050000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000005000000850000
    00FB000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00E30000006C0000000B00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000290000
    00D8000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EF000000780000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    007F000000FB000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EF000000780000000B0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0023000000D0000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EF000000780000000B00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00020000006A000000F6000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EF000000780000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000017000000BE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000EF000000790000000C0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000054000000F0000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F0000000790000
    000B000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000D000000A4000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EF0000
    00770000000B0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000037000000DF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EF000000780000000B00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000050000007B000000F8000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EF000000780000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000019000000BA000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EF000000780000000B0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000039000000D7000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EF000000780000000B00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000030000004E000000DD0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EF000000780000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000030000004E0000
    00DD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000EF0000006F000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000030000
    004F000000DD000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000ED0000006B0000
    0007000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000300000052000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EC0000
    006A000000070000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000006A0000000700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EC0000006A00000007000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000EC0000006A000000070000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000EC0000006A0000000700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000E10000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000EC0000006A00000007000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000530000
    00E1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000ED0000006B000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    0054000000E1000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000ED0000006B0000
    0007000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000400000054000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000EC0000
    006A000000070000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000006A0000000700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000EC0000006800000005000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F9000000930000000B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F90000009F0000001900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000E10000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F90000
    009F0000001A0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000530000
    00E1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F90000009F0000
    001900000000000000000000000000000000000000130000003A000000070000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000040000
    0054000000E1000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F90000009F0000001A0000
    00000000000000000000000000000000001300000093000000E1000000650000
    0006000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000400000054000000E1000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F90000009F00000019000000000000
    000000000000000000000000001300000093000000F7000000FF000000E90000
    005E000000040000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000400000054000000E1000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F90000009F0000001A00000000000000000000
    0000000000000000001300000093000000F7000000FF000000FF000000FF0000
    00DC000000360000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000400000054000000E1000000FF000000FF000000FF0000
    00FF000000FF000000F90000009F0000001A0000000000000000000000000000
    00000000001300000093000000F7000000FF000000FF000000FF000000FF0000
    00FD000000A10000000A00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000E1000000FF000000FF0000
    00FF000000F90000009F0000001A000000000000000000000000000000000000
    001300000093000000F7000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E40000002E00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000054000000E1000000FF0000
    00F90000009F0000001900000000000000000000000000000000000000120000
    0091000000F7000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000005700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000054000000DB0000
    009F0000001A00000000000000000000000000000000000000110000008B0000
    00F5000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FB0000006700000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000004000000330000
    001700000000000000000000000000000000000000120000008C000000F50000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000005C00000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000120000008C000000F5000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E50000003100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000120000008C000000F5000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FC0000009B0000000900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000050000007C000000F5000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FC0000
    00BD000000260000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000052000000E1000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000C10000
    0030000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000400000054000000DE000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000C1000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000300000044000000BE000000F70000
    00FF000000FF000000FF000000FF000000F8000000B700000031000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000001000000180000005C0000
    00A2000000C5000000C9000000B00000006D0000001A00000001000000000000
    000000000000000000000000000000000000000000000000000000000000C000
    07FFFFFFFF818000007FFFFFFE018000000FFFFFF80100000001FFFFE0018000
    00003FFF00018000000000000003C1FE00000000000FFFFFF0000000001FE0FF
    FF000000007FE03FFFE0000001FFC00FFFFC00000FFFC003FFFFE0007FFFE000
    FFFFFFFFFFFFE0003FFFFFFFFFFFF0001FFFFFFFFFFFF00007FFFFFFFFFFF800
    01FFFFFFFFFFF800007FFFFFFFFFFC00003FFFFFFFFFFC00001FFFFFFFFFFE00
    000FFFFFFFFFFE000007FFFFFFFFFF000003FFFFFFFFFF000001FFFFFFFFFF80
    0000FFFFFFFFFF8000007FFFFFFFFFC000003FFFFFFFFFE000001FFFFFFFFFE0
    00000FFFFFFFFFF0000007FFFFFFFFF8000003FFFFFFFFF8000001FFFFFFFFFC
    000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFFFF
    C000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFFF
    FC000000FFFFFFFFFE0000007FFFFFFFFF0000003FFFFFFFFF8000001FFFFFFF
    FFC000000FFFFFFFFFE000000FFFFFFFFFF000001FFFFFFFFFF800003FFFFFFF
    FFFC000078FFFFFFFFFE0000F07FFFFFFFFF0001E03FFFFFFFFF8003C03FFFFF
    FFFFC007801FFFFFFFFFE00F001FFFFFFFFFF01E001FFFFFFFFFF83C001FFFFF
    FFFFFC78001FFFFFFFFFFFF0001FFFFFFFFFFFE0001FFFFFFFFFFFC0003FFFFF
    FFFFFFC0003FFFFFFFFFFFE0007FFFFFFFFFFFF000FFFFFFFFFFFFF801FF2800
    0000300000006000000001002000000000008025000000000000000000000000
    00000000000000000000000000040000002300000044000000640000007F0000
    008E000000970000009D000000980000008B000000790000005F000000430000
    0027000000100000000200000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000700000049000000B3000000BB0000
    0042000000010000000200000061000000D9000000F3000000FB000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FE000000FB000000F30000
    00E2000000C20000008E00000055000000230000000900000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000020000002200000088000000E9000000FF000000FF0000
    00AE000000080000000E000000C0000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000F7000000DC000000AD000000680000002C0000
    000B000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00030000001D0000006C000000CE000000FB000000FF000000FF000000FC0000
    0099000000060000000600000091000000F8000000FA000000F1000000E50000
    00DB000000D3000000D0000000D4000000DB000000E8000000F2000000FB0000
    00FE000000FF000000FF000000FF000000FF000000FF000000FB000000E30000
    00B2000000710000003900000015000000050000000100000000000000000000
    0000000000000000000000000000000000000000000200000011000000390000
    0082000000D0000000F9000000FF000000FF000000FF000000F4000000A50000
    00240000000000000000000000160000005D0000005E0000003E0000002A0000
    001F000000180000001600000019000000200000002D00000042000000630000
    008D000000C0000000E6000000FA000000FF000000FF000000FF000000FF0000
    00FF000000FC000000EC000000CD000000A200000074000000520000003C0000
    0031000000300000003200000040000000600000008C000000C1000000EB0000
    00FD000000FF000000FF000000FF000000FC000000D5000000670000000F0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0002000000100000002F00000063000000A9000000DE000000F8000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000F8000000F10000
    00EA000000E9000000EB000000F2000000FA000000FF000000FF000000FF0000
    00FF000000FF000000FD000000DF0000008B0000002800000002000000000000
    00000000000000000000000000000000000B0000005600000067000000240000
    0003000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000008000000260000005D0000009D0000
    00D4000000F3000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FE0000
    00F4000000CD000000810000002E000000050000000000000000000000000000
    000000000000000000000000000000000053000000F0000000FA000000D60000
    0079000000230000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000050000
    001C000000480000007F000000B2000000D7000000EC000000F6000000FB0000
    00FE000000FE000000FE000000FA000000F3000000E2000000C5000000900000
    004E000000190000000300000000000000000000000000000000000000000000
    000000000000000000000000000000000066000000FB000000FF000000FF0000
    00FB000000D4000000760000001F000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000020000000A0000001C000000340000004C000000600000
    006E000000700000006C0000005C000000440000002800000011000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000029000000DB000000FF000000FF0000
    00FF000000FF000000FA000000CD000000660000001600000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000400000084000000FC000000FF0000
    00FF000000FF000000FF000000FF000000F7000000C20000005A0000000F0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000028000000DA000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F3000000B10000
    0047000000090000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000400000081000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00EC0000009A0000003000000003000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000025000000D50000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FD000000DC00000075000000150000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000003000000780000
    00FA000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F8000000B10000002D00000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000200000
    00D1000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000C500000031000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    006F000000F8000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FE000000C5000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0019000000C4000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FE000000C50000
    0031000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000100000059000000F3000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FD0000
    00C5000000310000000100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000F000000AD000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FE000000C50000003000000001000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000003E000000E6000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FE000000C500000031000000010000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000600000085000000FB000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000C5000000310000000100000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001C000000BC000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FE000000C50000003100000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000100000033000000CC000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FE000000C500000030000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000100000037000000CD000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000C2000000290000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000100000037000000CF0000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000BE0000
    0029000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000003A0000
    00D0000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FD0000
    00BE000000290000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    003A000000D0000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FD000000BE0000002900000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000003A000000D1000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FD000000BE00000029000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000003A000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FD000000BE000000290000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000003B000000D0000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FD000000BE0000002900000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000003A000000D0000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FD000000BE00000029000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000003A000000D0000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FD000000BE000000290000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000003A000000D00000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FD000000B90000
    0019000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000003A0000
    00D1000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F8000000970000
    0011000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    003A000000D0000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F800000098000000150000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000003B000000D0000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F80000009800000014000000000000
    0000000000060000004A00000024000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000003A000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F8000000980000001400000000000000000000
    000600000065000000E8000000BA000000240000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000003A000000D0000000FE000000FF000000FF0000
    00FF000000FF000000F800000098000000140000000000000000000000060000
    0065000000EA000000FF000000FD000000A80000001000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000003A000000D0000000FE000000FF0000
    00FF000000F80000009800000015000000000000000000000006000000650000
    00EA000000FF000000FF000000FF000000F40000005700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000003A000000D1000000FE0000
    00F8000000980000001500000000000000000000000600000065000000EA0000
    00FF000000FF000000FF000000FF000000FF000000A200000005000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000003A000000CA0000
    00970000001500000000000000000000000600000061000000E9000000FF0000
    00FF000000FF000000FF000000FF000000FF000000BC0000000C000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000220000
    001100000000000000000000000600000061000000E8000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000B000000009000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000600000061000000E8000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F90000006D00000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000050000000E7000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FC000000AE0000001700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000036000000D0000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FC000000B3000000230000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000100000038000000C3000000FA000000FF000000FF0000
    00FF000000FA000000B100000023000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000001E00000073000000B8000000CF0000
    00C10000007C0000001B00000000000000000000000000000000000000000000
    00000000000080007FFFFFC0000000000FFFFF000000000000FFFC0000000000
    000FE00100008000000000030000FFFC000000070000C1FFC000001F0000C07F
    F800007F0000C01FFF0003FF0000C007FFFFFFFF0000C003FFFFFFFF0000E000
    FFFFFFFF0000E0003FFFFFFF0000F0001FFFFFFF0000F00007FFFFFF0000F800
    03FFFFFF0000F80001FFFFFF0000FC0000FFFFFF0000FC00007FFFFF0000FE00
    003FFFFF0000FF00001FFFFF0000FF00000FFFFF0000FF800007FFFF0000FF80
    0003FFFF0000FFC00003FFFF0000FFE00001FFFF0000FFF00000FFFF0000FFF8
    00007FFF0000FFFC00003FFF0000FFFE00001FFF0000FFFF00000FFF0000FFFF
    800007FF0000FFFFC00003FF0000FFFFE00001FF0000FFFFF00001FF0000FFFF
    F80003FF0000FFFFFC00063F0000FFFFFE000C1F0000FFFFFF00180F0000FFFF
    FF80300F0000FFFFFFC060070000FFFFFFE0C0070000FFFFFFF180070000FFFF
    FFFF00070000FFFFFFFE000F0000FFFFFFFF001F0000FFFFFFFF003F0000FFFF
    FFFF807F00002800000028000000500000000100200000000000401A00000000
    000000000000000000000000000000000000000000190000004D000000730000
    0090000000A0000000A7000000A90000009F0000008F00000075000000540000
    0032000000140000000400000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000001000000190000
    007E000000C7000000790000000700000012000000AF000000F6000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FE000000F90000
    00E9000000CA0000009700000056000000250000000700000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000C0000004C000000BE0000
    00FA000000FF000000D60000001B0000001E000000D7000000FF000000FF0000
    00FD000000F9000000F7000000F7000000F9000000FD000000FE000000FF0000
    00FF000000FF000000FF000000F8000000DE000000A8000000620000002A0000
    000C000000010000000000000000000000000000000000000000000000000000
    00000000000000000003000000160000004F000000AB000000EF000000FF0000
    00FF000000F40000008D00000009000000040000005A000000A2000000870000
    0067000000550000004B0000004B000000540000006700000085000000AA0000
    00CF000000EE000000FD000000FF000000FF000000FF000000FA000000E30000
    00B80000008200000051000000310000002000000019000000180000001C0000
    002E0000004F0000008A000000CA000000F3000000FF000000FF000000FD0000
    00D7000000660000000E00000000000000000000000100000004000000020000
    0000000000000000000000000000000000000000000000000001000000060000
    00170000003C00000075000000B8000000E7000000FC000000FF000000FF0000
    00FF000000FE000000F8000000EA000000DD000000D4000000D3000000D90000
    00E7000000F7000000FE000000FF000000FF000000FD000000E3000000910000
    002A00000002000000000000000000000000000000010000003E000000800000
    00420000000A0000000000000000000000000000000000000000000000000000
    000000000000000000010000000D000000310000006B000000AC000000DE0000
    00F6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000F3000000CE0000008400000032000000060000
    0000000000000000000000000000000000000000000E000000BC000000FE0000
    00EC000000A50000004100000009000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000008000000240000
    004E00000080000000AC000000C9000000D9000000E1000000E2000000DC0000
    00CD000000B00000008200000048000000190000000300000000000000000000
    00000000000000000000000000000000000000000009000000A8000000FF0000
    00FF000000FE000000EB0000009F000000370000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000100000007000000110000001C00000024000000250000001F0000
    0014000000080000000100000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000004A000000EF0000
    00FF000000FF000000FF000000FE000000E4000000900000002E000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000C000000AC0000
    00FF000000FF000000FF000000FF000000FF000000FD000000DD0000007E0000
    0020000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000470000
    00EE000000FF000000FF000000FF000000FF000000FF000000FF000000FB0000
    00CE000000630000001100000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000B0000
    00A5000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F5000000B000000037000000030000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0040000000EA000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FE000000DB000000510000000300000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00090000009E000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000E10000005200000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000036000000E3000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000E100000052000000030000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000500000089000000FC000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000E1000000520000
    0003000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000024000000D3000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000E10000
    0052000000030000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000200000065000000F5000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00E1000000520000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000010000000A8000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000E10000005200000003000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000027000000C1000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000E100000052000000030000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000002D000000C2000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000DF0000004B0000000200000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000002D000000C50000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000DD0000004A00000002000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000DD0000004A000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    002F000000C6000000FE000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000DD0000004A0000
    0002000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000002F000000C6000000FE000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000DD0000
    004A000000020000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000002F000000C6000000FE000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00DD0000004A0000000200000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000002F000000C6000000FE000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000DD0000004A00000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000002F000000C6000000FE000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000DD00000049000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000002F000000C6000000FE0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F800000080000000040000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000010000002F000000C60000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F80000009400000013000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C6000000FE000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F800000094000000130000000000000003000000450000003F000000020000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    002F000000C6000000FE000000FF000000FF000000FF000000FF000000F80000
    00940000001300000000000000030000004F000000DF000000DA000000410000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00010000002F000000C6000000FE000000FF000000FF000000F8000000940000
    001300000000000000030000004F000000E0000000FF000000FF000000C20000
    0018000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000002F000000C6000000FE000000F800000094000000130000
    0000000000030000004F000000E0000000FF000000FF000000FF000000F70000
    0055000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000010000002F000000BF0000009300000013000000000000
    00030000004C000000DE000000FF000000FF000000FF000000FF000000FE0000
    007A000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000010000001B0000000F00000000000000030000
    004C000000DD000000FF000000FF000000FF000000FF000000FF000000FC0000
    006C000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000030000004C0000
    00DD000000FF000000FF000000FF000000FF000000FF000000FF000000DB0000
    002D000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000D000000AA0000
    00FE000000FF000000FF000000FF000000FF000000FF000000E5000000590000
    0003000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000010000002F0000
    00C0000000FC000000FF000000FF000000FF000000E40000005B000000050000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000010000
    001F0000007E000000C2000000D1000000B00000004900000005000000000000
    00000000000000000000000000008001FFFFC000000000003FFF800000000000
    03FC0000000000000000010000008FC000000300000083FC00000F00000080FF
    C0003F000000803FF801FF000000C00FFFFFFF000000C003FFFFFF000000E001
    FFFFFF000000E0007FFFFF000000F0003FFFFF000000F0001FFFFF000000F800
    0FFFFF000000F80007FFFF000000FC0003FFFF000000FC0001FFFF000000FE00
    00FFFF000000FF00007FFF000000FF00003FFF000000FF80001FFF000000FFC0
    000FFF000000FFE00007FF000000FFF00003FF000000FFF80001FF000000FFFC
    0000FF000000FFFE00007F000000FFFF00007F000000FFFF8000FF000000FFFF
    C0010F000000FFFFE00207000000FFFFF00407000000FFFFF80807000000FFFF
    FC1003000000FFFFFE2007000000FFFFFFC007000000FFFFFFC007000000FFFF
    FFC00F000000FFFFFFE01F000000280000002000000040000000010020000000
    0000801000000000000000000000000000000000000000000007000000480000
    0081000000A1000000B0000000B6000000B3000000A50000008B000000660000
    003B000000180000000400000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000050000003E000000B0000000AD0000001B00000035000000E70000
    00FE000000FF000000FF000000FF000000FF000000FF000000FF000000FC0000
    00EF000000D10000009A00000057000000210000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000050000
    002900000086000000E5000000FE000000E50000003000000020000000B60000
    00CC000000B3000000A1000000990000009E000000AE000000C6000000DF0000
    00F5000000FE000000FF000000F8000000DB000000A500000066000000360000
    001A0000000C00000008000000080000000E000000220000004E000000980000
    00DE000000FC000000FD000000D8000000600000000700000001000000100000
    0015000000080000000400000002000000030000000600000010000000230000
    004B00000088000000C7000000EF000000FD000000FF000000FB000000ED0000
    00D5000000C1000000B4000000B5000000C4000000DE000000F5000000FE0000
    00FE000000E7000000970000002C0000000200000000000000000000001A0000
    0087000000690000001A00000001000000000000000000000000000000000000
    000000000002000000120000003C0000007A000000BA000000E2000000F70000
    00FE000000FF000000FF000000FF000000FF000000FC000000F0000000CD0000
    0087000000350000000700000000000000000000000000000000000000470000
    00F4000000F9000000CA00000068000000170000000100000000000000000000
    0000000000000000000000000000000000010000000C000000270000004C0000
    00720000008D0000009B0000009A00000089000000670000003D000000170000
    00030000000000000000000000000000000000000000000000000000001D0000
    00D0000000FF000000FF000000F8000000C30000005A00000011000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000000200000002000000010000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000020000
    0070000000FA000000FF000000FF000000FF000000F5000000B6000000490000
    000A000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001C000000CD000000FF000000FF000000FF000000FF000000FF000000EF0000
    009F000000310000000300000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000100000069000000F8000000FF000000FF000000FF000000FF000000FF0000
    00FE000000DE000000690000000A000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000018000000C7000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F20000007B0000000A0000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000010000005F000000F5000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F20000007B0000000A00000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000011000000B6000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F30000007B0000000A000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000046000000EB000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F20000007B0000000A0000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000070000008E000000FB000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000F20000007B0000
    000A000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001C000000B5000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000F20000
    007B0000000A0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000023000000B7000000FD0000
    00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00F2000000760000000800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000024000000BA0000
    00FD000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000F10000007400000008000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000250000
    00BA000000FD000000FF000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000F100000074000000080000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0025000000BA000000FD000000FF000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000F1000000740000000800000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000025000000BA000000FD000000FF000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000F10000007500000008000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000025000000BA000000FD000000FF000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F100000074000000080000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000025000000BA000000FD000000FF000000FF0000
    00FF000000FF000000FF000000FF000000FF000000FF000000E9000000420000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000025000000BA000000FD000000FF0000
    00FF000000FF000000FF000000FF000000FF000000F700000090000000100000
    0000000000010000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000025000000BA000000FD0000
    00FF000000FF000000FF000000FF000000F70000009000000010000000010000
    00390000005D0000000800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000025000000BA0000
    00FD000000FF000000FF000000F70000009000000010000000010000003B0000
    00D2000000EF0000006100000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000250000
    00BA000000FD000000F70000009000000010000000010000003B000000D20000
    00FE000000FF000000D00000001B000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0025000000B40000008F000000100000000100000039000000D1000000FE0000
    00FF000000FF000000F000000039000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000150000000D0000000100000039000000D0000000FE000000FF0000
    00FF000000FF000000E80000002F000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000002A000000CE000000FE000000FF000000FF0000
    00FF000000FA000000970000000A000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001F000000B8000000FC000000FF000000FF0000
    00FA000000A40000001800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001E00000088000000CB000000CE0000
    008900000018000000000000000000000000000000000007FFE00000FF800000
    00000000000183E0000780FC001F807FE1FF801FFFFFC007FFFFC003FFFFE001
    FFFFE000FFFFF0007FFFF8003FFFF8001FFFFC000FFFFE0007FFFF0003FFFF80
    01FFFFC000FFFFE0007FFFF0003FFFF8003FFFFC002FFFFE0007FFFF0003FFFF
    8003FFFFC003FFFFE003FFFFF803FFFFF807FFFFFC0F28000000180000003000
    0000010020000000000060090000000000000000000000000000000000000000
    002200000088000000B0000000BE000000C1000000B70000009F000000760000
    0043000000190000000400000000000000000000000000000000000000000000
    00000000000000000000000000010000001500000073000000C4000000400000
    0056000000EC000000E7000000DC000000DA000000E1000000EF000000F90000
    00F2000000D30000009800000052000000230000000B00000002000000010000
    0001000000080000002200000062000000C1000000F7000000D5000000370000
    000D000000390000002D0000001E0000001C00000023000000370000005D0000
    009A000000D3000000F4000000F7000000DE000000BB0000009B0000008C0000
    0093000000B2000000DC000000F8000000E90000009B0000002C000000020000
    0002000000660000008F00000035000000060000000000000000000000000000
    00040000001A000000490000008A000000C1000000E0000000EF000000F40000
    00F2000000E6000000C700000089000000390000000800000000000000000000
    000300000093000000FD000000E6000000920000002D00000004000000000000
    00000000000000000000000000020000000E0000002300000037000000410000
    003D0000002A0000001100000002000000000000000000000000000000000000
    000000000039000000E8000000FF000000FD000000DF00000082000000220000
    0002000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000700000099000000FE000000FF000000FF000000FC000000D20000
    00650000000F0000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000035000000E5000000FF000000FF000000FF000000FF0000
    00F60000009F0000001800000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000050000008E000000FD000000FF000000FF000000FF0000
    00FF000000FB000000A500000018000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000029000000DA000000FF000000FF000000FF0000
    00FF000000FF000000FB000000A5000000190000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000020000006F000000F8000000FF000000FF0000
    00FF000000FF000000FF000000FB000000A50000001800000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000012000000A5000000FC000000FF0000
    00FF000000FF000000FF000000FF000000FB000000A500000018000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000001B000000AB000000FC0000
    00FF000000FF000000FF000000FF000000FF000000FB000000A1000000160000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000001C000000AD0000
    00FC000000FF000000FF000000FF000000FF000000FF000000FA000000A00000
    0016000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000001C0000
    00AD000000FC000000FF000000FF000000FF000000FF000000FF000000FA0000
    00A0000000160000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001C000000AD000000FC000000FF000000FF000000FF000000FF000000FF0000
    00FA000000A00000001600000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000001C000000AD000000FC000000FF000000FF000000FF000000FF0000
    00FF000000FA0000009B0000000C000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000001C000000AD000000FC000000FF000000FF000000FF0000
    00FF000000F7000000890000000A000000020000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001C000000AD000000FC000000FF000000FF0000
    00F70000008C0000000F0000002A000000770000001400000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000001C000000AD000000FC000000F70000
    008C0000000F0000002A000000C1000000F80000007E00000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000001C000000A60000008A0000
    000F00000029000000C1000000FE000000FF000000C700000010000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000100000000B0000
    0029000000BF000000FD000000FF000000FF000000B70000000B000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000030000
    0081000000FA000000FF000000FF000000DD0000004500000001000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001B0000008F000000D1000000BE00000046000000020000000000000000001F
    E00000000000000000000700030001E00F00807FFF00803FFF00C01FFF00C00F
    FF00E007FF00E003FF00F001FF00F800FF00FC007F00FE003F00FF001F00FF80
    0F00FFC00700FFE00300FFF00100FFF80100FFFC0100FFFE0100FFFF03002800
    0000140000002800000001002000000000009006000000000000000000000000
    0000000000000000003B000000A5000000C0000000C7000000C0000000A90000
    007E000000450000001900000003000000000000000000000000000000000000
    0000000000000000000C00000053000000BD0000005700000053000000BD0000
    00A90000009F000000A8000000C1000000E0000000EC000000D2000000970000
    00570000002F0000001E0000001C0000002E00000060000000B2000000EC0000
    00BF00000031000000070000003F0000002500000005000000040000000D0000
    0024000000560000009C000000D4000000EC000000E8000000DD000000DB0000
    00E7000000EB000000C70000006E000000180000000000000010000000C00000
    00D5000000760000001D000000010000000000000000000000040000001A0000
    003F000000660000007D0000007F000000680000003D00000013000000010000
    000000000000000000030000007D000000FC000000FB000000CE000000670000
    0014000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000230000
    00D6000000FF000000FF000000F8000000BD0000004800000005000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000200000076000000FB000000FF000000FF0000
    00FF000000E90000006700000006000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    001D000000CC000000FF000000FF000000FF000000FF000000EC000000670000
    0006000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000010000005F000000F5000000FF0000
    00FF000000FF000000FF000000EC000000670000000600000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000D0000009C000000FB000000FF000000FF000000FF000000FF0000
    00EC000000670000000600000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000018000000A50000
    00FB000000FF000000FF000000FF000000FF000000EC00000064000000050000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000018000000A6000000FB000000FF000000FF0000
    00FF000000FF000000EB00000063000000050000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0019000000A6000000FB000000FF000000FF000000FF000000FF000000EB0000
    0063000000050000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000019000000A6000000FB0000
    00FF000000FF000000FF000000FF000000EB0000006000000003000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000019000000A6000000FB000000FF000000FF000000FF0000
    00F70000007F0000000700000002000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000190000
    00A6000000FB000000FF000000F70000008A000000130000005E000000580000
    0003000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000019000000A6000000F30000008A0000
    001300000066000000EC000000DD000000270000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000018000000590000001300000064000000EC000000FF000000F30000
    0040000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000410000
    00E8000000FF000000FD000000B8000000170000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000001700000090000000D3000000AA000000260000
    000000000000003F000000000000000010000300300001FFF000807FF000803F
    F000C01FF000C00FF000E007F000F003F000F801F000FC00F000FE007000FF00
    3000FF801000FFC01000FFE01000FFF81000FFF8300028000000100000002000
    0000010020000000000040040000000000000000000000000000000000000000
    0058000000BB000000C6000000C4000000B20000008300000046000000180000
    0004000000000000000000000000000000090000003B000000A7000000690000
    003D0000006F000000560000005A00000078000000AC000000D2000000CB0000
    009D000000710000006200000076000000AF000000D70000009E000000250000
    0021000000A00000005A00000011000000010000000700000023000000570000
    0091000000B6000000BF000000B2000000830000003B00000009000000000000
    0014000000C2000000F5000000B90000004D0000000B00000000000000000000
    0002000000080000000C00000007000000010000000000000000000000000000
    00010000005C000000F6000000FF000000F0000000A20000002A000000010000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000012000000BC000000FF000000FF000000FE000000C9000000310000
    0001000000000000000000000000000000000000000000000000000000000000
    0000000000000000004E000000F0000000FF000000FF000000FE000000CA0000
    0031000000010000000000000000000000000000000000000000000000000000
    0000000000000000000900000091000000FA000000FF000000FF000000FE0000
    00C9000000310000000100000000000000000000000000000000000000000000
    00000000000000000000000000140000009E000000FA000000FF000000FF0000
    00FE000000C80000002F00000001000000000000000000000000000000000000
    0000000000000000000000000000000000150000009F000000FA000000FF0000
    00FF000000FE000000C70000002F000000010000000000000000000000000000
    000000000000000000000000000000000000000000150000009F000000FA0000
    00FF000000FF000000FE000000C70000002E0000000000000000000000000000
    00000000000000000000000000000000000000000000000000150000009F0000
    00FA000000FF000000FF000000F50000006A0000000500000000000000000000
    0000000000000000000000000000000000000000000000000000000000150000
    009F000000FA000000F600000088000000290000008500000026000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0015000000990000008500000029000000AD000000FB00000080000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000B0000001B000000A8000000FC000000F80000006C000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000F0000008E000000D30000008A00000010000000000070
    000000000000000100000307000000FF0000807F0000C03F0000C01F0000E00F
    0000F0070000F8070000FC030000FE010000FF010000FF810000FFC10000}
  OldCreateOrder = False
  OnCreate = FormCreate
  DesignSize = (
    1280
    733)
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 936
    Height = 726
    Anchors = [akLeft, akTop, akRight, akBottom]
    BevelOuter = bvNone
    Caption = #25163#20889#21306
    TabOrder = 0
    DesignSize = (
      936
      726)
    object Edit1: TEdit
      Left = 625
      Top = 13
      Width = 311
      Height = 34
      Anchors = [akTop, akRight]
      BorderStyle = bsNone
      Color = clBtnFace
      Ctl3D = False
      Font.Charset = ANSI_CHARSET
      Font.Color = clWindowText
      Font.Height = -21
      Font.Name = #24494#36719#38597#40657
      Font.Style = []
      ParentCtl3D = False
      ParentFont = False
      TabOrder = 0
    end
  end
  object Button1: TButton
    Left = 955
    Top = 70
    Width = 116
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #28165#31354#25163#20889#21306
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 1
    OnClick = Button1Click
  end
  object edtName: TEdit
    Left = 950
    Top = 13
    Width = 311
    Height = 36
    Anchors = [akTop, akRight]
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -21
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 2
  end
  object Button2: TButton
    Left = 955
    Top = 150
    Width = 149
    Height = 96
    Anchors = [akTop, akRight]
    Caption = #21024#38500#31508#30011
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -29
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 3
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 1085
    Top = 70
    Width = 86
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #30830'  '#35748
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 4
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 1180
    Top = 70
    Width = 86
    Height = 43
    Anchors = [akTop, akRight]
    Caption = #21024'  '#38500
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = #24494#36719#38597#40657
    Font.Style = []
    ParentFont = False
    TabOrder = 5
    OnClick = Button4Click
  end
  object InkCLT: TInkCollector
    AutoConnect = True
    ConnectKind = ckRunningOrNew
    OnStroke = InkCLTStroke
    Left = 69
    Top = 25
  end
  object InkRC: TInkRecognizerContext
    AutoConnect = False
    ConnectKind = ckRunningOrNew
    Left = 116
    Top = 25
  end
end
demo/TabletPC/Unit1.~pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, MSINKAUTLib_TLB, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    InkCLT: TInkCollector;
    InkRC: TInkRecognizerContext;
    Panel1: TPanel;
    Button1: TButton;
    edtName: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure InkCLTStroke(ASender: TObject; const Cursor: IInkCursor;
      const Stroke: IInkStrokeDisp; var Cancel: WordBool);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    procedure InitializeInkCollector;
    function  DeleteStr(str :WideString):WideString;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
//------- è‡ªå®šä¹‰å‡½æ•° ------------------------------
//初始化InkCLT
procedure TForm1.InitializeInkCollector;
begin
  InkCLT.hWnd := panel1.Handle;
  InkCLT.Enabled := true;
  InkCLT.DefaultDrawingAttributes.Color := clRed; // å¢¨æ°´é¢œè‰²
  InkCLT.DefaultDrawingAttributes.Width := 200; // ç¬”的宽度
end;
function TForm1.DeleteStr(str :WideString):WideString;
var
  LengthOfText: Integer;
begin
  LengthOfText := Length(str);
  if LengthOfText > 0 then
  begin
    // åˆ é™¤æœ€åŽä¸€ä¸ªå­—符
    Delete(str, LengthOfText, 1);
  end;
  Result := str;
end;
//-------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  InitializeInkCollector;
end;
procedure TForm1.InkCLTStroke(ASender: TObject; const Cursor: IInkCursor;
  const Stroke: IInkStrokeDisp; var Cancel: WordBool);
//var
//  ActiveCtrl: TWinControl;
begin
  //返回当前拥有焦点的控件
  //ActiveCtrl := Screen.ActiveControl;
  //if ActiveCtrl is TEdit then
  //  TEdit(ActiveCtrl).Text := TEdit(ActiveCtrl).Text + Stroke.Ink.Strokes.ToString
  //else if ActiveCtrl is TMemo then
  //  TMemo(ActiveCtrl).Lines.Add(Stroke.Ink.Strokes.ToString);
    Edit1.Text := Stroke.Ink.Strokes.ToString;
  //else
  //  ShowMessage('提示:当前焦点不在编辑框或多行编辑框上.');
end;
//清空手写区
procedure TForm1.Button1Click(Sender: TObject);
begin
  InkCLT.Ink.DeleteStrokes(InkCLT.Ink.Strokes);
  Edit1.Clear;
  Panel1.Refresh;
end;
//删除一个字,要统计每个字有多少壁画,Ink只能追踪笔画,按笔画来删除!!!
procedure TForm1.Button2Click(Sender: TObject);
var
  Strokes: IInkStrokes;
  LastStroke: IInkStrokeDisp;
begin
  //Edit1.Text := DeleteStr(Edit1.Text);
  if InkCLT.Ink.Strokes.Count > 0 then
  begin
    Strokes := InkCLT.Ink.Strokes;
    LastStroke := Strokes.Item(Strokes.Count - 1) as IInkStrokeDisp;
    InkCLT.Ink.DeleteStroke(LastStroke);
  end;
end;
//确认备选字
procedure TForm1.Button3Click(Sender: TObject);
begin
  edtName.Text := edtName.Text + Trim(Edit1.Text);
  Button1Click(Sender);
end;
//删除Edit1的一个字
procedure TForm1.Button4Click(Sender: TObject);
begin
  edtName.Text := DeleteStr(edtName.Text);
end;
end.
demo/TabletPC/ÊÖдͼ±ê(ĬÈÏ)_64.ico
demo/TabletPC/ÊÖдͼ±ê_64.ico
demo/TabletPC/˵Ã÷.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
感谢 Chee Wee Chua
原版地址:http://cc.embarcadero.com/Item/22684
安装好 ink ç›®å½•中的 ink.dpk åŽï¼Œè¿è¡Œ æ”¯æŒåº“ ç›®å½• ä¸­çš„ æ³¨å†Œ.bat
每个笔画只能识别出一字来。
Winxp sp2 + delphi 7.0 ç¼–译通过
doc/Ô­ÐÍÉè¼Æ-½çÃæ½ØÍ¼/0.Ê×Ò³.png
doc/Ô­ÐÍÉè¼Æ-½çÃæ½ØÍ¼/1.²âÊÔ£¨ÊÖ¶¯¼ì²â£©.png
doc/Ô­ÐÍÉè¼Æ-½çÃæ½ØÍ¼/2.ÇúÏߣ¨·ÖÎö£©.png
doc/Ô­ÐÍÉè¼Æ-½çÃæ½ØÍ¼/3.У׼.png
doc/Ô­ÐÍÉè¼Æ-½çÃæ½ØÍ¼/4.ÉèÖÃ.png
doc/΢²¨Ë®·ÖÒÇÈí¼þÐ޸ļǼ-20250224.docx
Binary files differ
doc/½Ó¿ÚÉè¼Æ/Actuator.dll
Binary files differ
doc/½Ó¿ÚÉè¼Æ/Actuator.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,164 @@
// ä¸‹åˆ— ifdef å—是创建使从 DLL å¯¼å‡ºæ›´ç®€å•çš„
// å®çš„æ ‡å‡†æ–¹æ³•。此 DLL ä¸­çš„æ‰€æœ‰æ–‡ä»¶éƒ½æ˜¯ç”¨å‘½ä»¤è¡Œä¸Šå®šä¹‰çš„ ACTUATOR_EXPORTS
// ç¬¦å·ç¼–译的。在使用此 DLL çš„
// ä»»ä½•项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ACTUATOR_API å‡½æ•°è§†ä¸ºæ˜¯ä»Ž DLL å¯¼å…¥çš„,而此 DLL åˆ™å°†ç”¨æ­¤å®å®šä¹‰çš„
// ç¬¦å·è§†ä¸ºæ˜¯è¢«å¯¼å‡ºçš„。
#ifdef ACTUATOR_EXPORTS
#define ACTUATOR_API __declspec(dllexport)
#else
#define ACTUATOR_API __declspec(dllimport)
#endif
typedef enum
{
    //粮种准备命令代码(粮种已修改)
    READY_GRAIN = 0x01,
    //返回准备完成
    READY_FINISH = 0x02,
    //检测启动命令
    DETECT_START = 0x03,
    //返回检测完毕
    DETECT_FINISH = 0x04,
    //设备水分仪复位命令
    DEVICE_WR_RESET = 0xFE,
    //返回水分仪故障代码
    DEVICE_WR_FAULT = 0xFF
}PLCWORD;
typedef enum
{
    //水分仪准备指令
    WR_READY = 0x01,
    //水分仪检测指令
    WR_DETECT = 0x02,
    //水分仪校验指令
    WR_VERIFY = 0x03
}WRWORD;
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   ç½‘络端口
ACTUATOR_API void* CreatePlcDevice(const char* strIp, int nPort);
//创建水分仪句柄ctx
//szSerialPort:   ä¸²å£å
//baud:       æ³¢ç‰¹çއ
//parity:     æ ¡éªŒç±»åž‹
//data_bit:   æ•°æ®ä½
//stop_bit:   åœæ­¢ä½
ACTUATOR_API void* CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
//连接客户设备或水分仪装置
//ctxDev : è®¾å¤‡å¥æŸ„
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ConnectDevice(void* ctxDev);
//获取状态或粮种更改信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x03:  å¼€å§‹æµ‹è¯•
//         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
//         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
//写回状态
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x02:  å‡†å¤‡å·²å®Œæˆ
//         0x04:  æ£€æµ‹å®Œæˆ
//         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
//ACTUATOR_API int WriteState(void* ctxDev, unsigned short nState);
ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState);
//回传检测数据
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç²®ç§ç¼–码
//         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
//         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
//nSize  : æ•°æ®ä¸ªæ•°
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
//下发命令信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nCmdType ï¼šå‘½ä»¤å­—,如下描述
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x02:  å¼€å§‹æµ‹è¯•
//         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
// nResponseSeconds: å“åº”时间,以秒计算
// nResponseUSeconds: å“åº”时间,以微妙计算,若小于秒,全部用微妙表示。
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
//下发参数
//ctxDev : è®¾å¤‡å¥æŸ„
//nStartFreq ï¼šèµ·å§‹é¢‘率
//nStopFreq ï¼š ç»ˆæ­¢é¢‘率
//nStepFreq ï¼š æ­¥é•¿
//nDecayCode ï¼šè¡°å‡ç 
//nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
                            unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
//读取检测信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç”µåދ值
//         é‡é‡
//         æ¸©åº¦
//         æ¹¿åº¦
// nSize : è¯»å–4个寄存器
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
//读取扫频值,其实为电平值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nVcc   ï¼šç”µå¹³å€¼æŒ‡é’ˆ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadVcc(void* ctxDev, unsigned short* nVcc);
//断开水分仪或客户设备的连接,并销毁资源
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int DestroyDevice(void* ctxDev);
//算法函数
//x ä¸ºæµ‹é‡å€¼
//y ä¸ºå®žé™…值
//n ä¸ºæ‹Ÿåˆæ¬¡æ•°
//nSampleNumber æ ·æœ¬æ•°é‡
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
doc/½Ó¿ÚÉè¼Æ/ActuatorDemo.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,277 @@
// ActuatorDemo.cpp : æ­¤æ–‡ä»¶åŒ…含 "main" å‡½æ•°ã€‚程序执行将在此处开始并结束。
//
#include <iostream>
#include "../Actuator//Actuator.h"
//系数
const double coef[5] = { 1,1,0.01,0,0 };
void ExeTest()
{
    void* hPlcDev = CreatePlcDevice("127.0.0.1", 1502);
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hPlcDev) ret = ConnectDevice(hPlcDev);
    if (hWrDev) ret = ConnectDevice(hWrDev);
    char ch = 0;
    while ('c' != (ch = getchar()))  //按 c é€€å‡ºè‡ªåŠ¨æ£€æµ‹
    {
        //读PLC状态字
        ret = ReadState(hPlcDev, &nState, &nGrainType);
        if (ret <= 0)
        {
            printf("读取PLC状态字异常!\n");
        }
        else if (nGrainType > 0 && nState > 0)
        {
            switch (nState)
            {
            case READY_GRAIN: //粮食品种修改了
            {
                //向水分仪发粮种更改,启动准备
                ret = SendCommands(hWrDev, WR_READY, nGrainType, 10, 0);
                if (ret <= 0)
                {
                    printf("粮食品种修改失败!水分仪故障!\n");
                    ret = ResponseState(hPlcDev, DEVICE_WR_FAULT);
                }
                else
                {
                    printf("粮食品种修改成功!准备就绪\n");
                    ret = ResponseState(hPlcDev, READY_FINISH);
                }
            }
            break;
            case DETECT_START: //开始测试
            {
                ret = SendCommands(hWrDev, WR_DETECT, 0, 15, 0);
                if (ret <= 0)
                {
                    printf("执行检测失败!\n");
                    ret = ResponseState(hPlcDev, DEVICE_WR_FAULT);
                }
                else
                {
                    unsigned short nDatas[10] = { 0 };
                    //从水分仪器读取数据
                    ret = ReadDatas(hWrDev, nDatas);
                    printf("执行检测成功!\n");
                    ret = ResponseState(hPlcDev, DETECT_FINISH);
                    //计算水分率
                    double v = coef[0] +
                        coef[1] * nDatas[0] +
                        coef[2] * nDatas[0] * nDatas[0] +
                        coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                        coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                    nDatas[0] = 0x01; // ç²®é£Ÿå“ç§
                    nDatas[1] = v; // 21.30% //含水率
                    nDatas[2] = 5150; // 51.50; //容重比
                    ret = UploadData(hPlcDev, nDatas);
                }
            }
            break;
            case DEVICE_WR_RESET: //复位命令
            {
            }
            break;
            default:
                break;
            }
        }
    }
    if (hPlcDev) DestroyDevice(&hPlcDev);
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动写参数
void ExeWriteParam()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = WriteParams(hWrDev, 10500, 12000, 50, 1, 1);
    if (ret <= 0)
        printf("下发参数失败!\n");
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动检测
void ExeManTest()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_READY, 0x01, 10, 0); //下发确认
    if (ret <= 0)
        printf("准备失败!\n");
    else
    {
        ret = SendCommands(hWrDev, WR_DETECT, 0, 15, 0); //执行启动命令
        if (ret <= 0)
        {
            printf("执行检测失败!\n");
        }
        else
        {
            unsigned short nDatas[10] = { 0 };
            //从水分仪器读取数据
            ret = ReadDatas(hWrDev, nDatas);
            //计算水分率
            double v = coef[0] +
                coef[1] * nDatas[0] +
                coef[2] * nDatas[0] * nDatas[0] +
                coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
            printf(" After Detection,");
            printf(" %d %d %d %d", nDatas[0], nDatas[0], nDatas[0], nDatas[0]);
            printf(" Water Rate:%lf", v);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
//
void ExeVerifyTest()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_READY, 0x01, 10,0); //下发确认
    if (ret <= 0)
    {
        printf("确认失败!\n");
    }
    else
    {
        ret = SendCommands(hWrDev, WR_VERIFY, 0, 15, 0); //执行启动命令
        if (ret <= 0)
        {
            printf("校准执行失败!\n");
        }
        else
        {
            unsigned short nVcc = 0;
            //从水分仪器读取数据
            ret = ReadVcc(hWrDev, &nVcc);
            printf(" Detected Val: %d", nVcc);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
void TestLinearize()
{
    int nSampeCount = 12;
     float x[]={0,1,2,3,4,5,6,7,8,9,10,11}; //realval
     float y[]={2506,2200,1846,1440,1004,548,79,-387,-847,-1288,-1700,-2066}; //input
     double coef[5] = { 0 };
     int ret = Linearize(x, y, coef, 2, nSampeCount);
     if (ret > 0)
     {
         printf("Coef: %f, %f, %f, %f, %f\n", coef[0], coef[1], coef[2], coef[3], coef[4]);
         float v = 3.0f;
         printf("Input %lf, Cal Val:%lf\n", v,
             (coef[0] +
                 coef[1] * v +
                 coef[2] * v * v +
                 coef[3] * v * v * v +
                 coef[4] * v * v * v * v)
         );
     }
}
int main()
{
    std::cout << "Hello World!\n";
    char ch = 0;
    while ('x' != ( ch = getchar() )) //按 x é€€å‡ºç¨‹åº
    {
        switch (ch)
        {
            case 'a': //自动测试
                ExeTest();
                break;
            case 'p': //向水份仪下发参数
                ExeWriteParam();
                break;
            case 'd': //手动检测
                ExeManTest();
                break;
            case 'v':  //校准
                ExeVerifyTest();
                break;
            case 'l': //拟合测试
                TestLinearize();
                break;
            default:
                break;
        }
    }
}
// è¿è¡Œç¨‹åº: Ctrl + F5 æˆ–调试 >“开始执行(不调试)”菜单
// è°ƒè¯•程序: F5 æˆ–调试 >“开始调试”菜单
// å…¥é—¨ä½¿ç”¨æŠ€å·§:
//   1. ä½¿ç”¨è§£å†³æ–¹æ¡ˆèµ„源管理器窗口添加/管理文件
//   2. ä½¿ç”¨å›¢é˜Ÿèµ„源管理器窗口连接到源代码管理
//   3. ä½¿ç”¨è¾“出窗口查看生成输出和其他消息
//   4. ä½¿ç”¨é”™è¯¯åˆ—表窗口查看错误
//   5. è½¬åˆ°â€œé¡¹ç›®â€>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. å°†æ¥ï¼Œè‹¥è¦å†æ¬¡æ‰“开此项目,请转到“文件”>“打开”>“项目”并选择 .sln æ–‡ä»¶
doc/½Ó¿ÚÉè¼Æ/old/Actuator.dll
Binary files differ
doc/½Ó¿ÚÉè¼Æ/old/Actuator.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
// ä¸‹åˆ— ifdef å—是创建使从 DLL å¯¼å‡ºæ›´ç®€å•çš„
// å®çš„æ ‡å‡†æ–¹æ³•。此 DLL ä¸­çš„æ‰€æœ‰æ–‡ä»¶éƒ½æ˜¯ç”¨å‘½ä»¤è¡Œä¸Šå®šä¹‰çš„ ACTUATOR_EXPORTS
// ç¬¦å·ç¼–译的。在使用此 DLL çš„
// ä»»ä½•项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ACTUATOR_API å‡½æ•°è§†ä¸ºæ˜¯ä»Ž DLL å¯¼å…¥çš„,而此 DLL åˆ™å°†ç”¨æ­¤å®å®šä¹‰çš„
// ç¬¦å·è§†ä¸ºæ˜¯è¢«å¯¼å‡ºçš„。
#ifdef ACTUATOR_EXPORTS
#define ACTUATOR_API __declspec(dllexport)
#else
#define ACTUATOR_API __declspec(dllimport)
#endif
typedef enum
{
    //粮种准备命令代码(粮种已修改)
    READY_GRAIN = 0x01,
    //返回准备完成
    READY_FINISH = 0x02,
    //检测启动命令
    DETECT_START = 0x03,
    //返回检测完毕
    DETECT_FINISH = 0x04,
    //设备水分仪复位命令
    DEVICE_WR_RESET = 0xFE,
    //返回水分仪故障代码
    DEVICE_WR_FAULT = 0xFF
}PLCWORD;
typedef enum
{
    //水分仪准备指令
    WR_READY = 0x01,
    //水分仪检测指令
    WR_DETECT = 0x02,
    //水分仪校验指令
    WR_VERIFY = 0x03
}WRWORD;
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   ç½‘络端口
ACTUATOR_API void* CreatePlcDevice(const char* strIp, int nPort);
//创建水分仪句柄ctx
//szSerialPort:   ä¸²å£å
//baud:       æ³¢ç‰¹çއ
//parity:     æ ¡éªŒç±»åž‹
//data_bit:   æ•°æ®ä½
//stop_bit:   åœæ­¢ä½
ACTUATOR_API void* CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
//连接客户设备或水分仪装置
//ctxDev : è®¾å¤‡å¥æŸ„
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ConnectDevice(void* ctxDev);
//获取状态或粮种更改信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x03:  å¼€å§‹æµ‹è¯•
//         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
//         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
//写回状态
//ctxDev : è®¾å¤‡å¥æŸ„
//nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
//         0x02:  å‡†å¤‡å·²å®Œæˆ
//         0x04:  æ£€æµ‹å®Œæˆ
//         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int WriteState(void* ctxDev, unsigned short nState);
//回传检测数据
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç²®ç§ç¼–码
//         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
//         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
//nSize  : æ•°æ®ä¸ªæ•°
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
//下发命令信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nCmdType ï¼šå‘½ä»¤å­—,如下描述
//         0x01:  ç²®ç§å·²ä¿®æ”¹
//         0x02:  å¼€å§‹æµ‹è¯•
//         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
//nGoodType: ç²®ç§ç¼–号
//         0x01:  å°éº¦,
//         0x02:  æ°´ç¨»
//         0x03:  é»„豆
//         0x04:  çŽ‰ç±³
//         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0);
//下发参数
//ctxDev : è®¾å¤‡å¥æŸ„
//nStartFreq ï¼šèµ·å§‹é¢‘率
//nStopFreq ï¼š ç»ˆæ­¢é¢‘率
//nStepFreq ï¼š æ­¥é•¿
//nDecayCode ï¼šè¡°å‡ç 
//nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
                            unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
//读取检测信息
//ctxDev : è®¾å¤‡å¥æŸ„
//nDatas ï¼šæ•°ç»„,数据顺序如下
//         ç”µåދ值
//         é‡é‡
//         æ¸©åº¦
//         æ¹¿åº¦
// nSize : è¯»å–4个寄存器
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
//读取扫频值,其实为电平值,
//ctxDev : è®¾å¤‡å¥æŸ„
//nVcc   ï¼šç”µå¹³å€¼æŒ‡é’ˆ
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int ReadVcc(void* ctxDev, unsigned short* nVcc);
//断开水分仪或客户设备的连接,并销毁资源
//ctxDev : è®¾å¤‡å¥æŸ„指针
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int DestroyDevice(void* ctxDev);
//算法函数
//x ä¸ºæµ‹é‡å€¼
//y ä¸ºå®žé™…值
//n ä¸ºæ‹Ÿåˆæ¬¡æ•°
//nSampleNumber æ ·æœ¬æ•°é‡
//返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
ACTUATOR_API int Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
doc/½Ó¿ÚÉè¼Æ/old/ActuatorDemo.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,278 @@
// ActuatorDemo.cpp : æ­¤æ–‡ä»¶åŒ…含 "main" å‡½æ•°ã€‚程序执行将在此处开始并结束。
//
#include <iostream>
#include "../Actuator//Actuator.h"
//系数
const double coef[5] = { 1,1,0.01,0,0 };
void ExeTest()
{
    void* hPlcDev = CreatePlcDevice("127.0.0.1", 1502);
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hPlcDev) ret = ConnectDevice(hPlcDev);
    if (hWrDev) ret = ConnectDevice(hWrDev);
    char ch = 0;
    while ('c' != (ch = getchar()))  //按 c é€€å‡ºè‡ªåŠ¨æ£€æµ‹
    {
        //读PLC状态字
        ret = ReadState(hPlcDev, &nState, &nGrainType);
        if (ret <= 0)
        {
            printf("读取PLC状态字异常!\n");
        }
        else if (nGrainType > 0 && nState > 0)
        {
            switch (nState)
            {
            case READY_GRAIN: //粮食品种修改了
            {
                //向水分仪发粮种更改,启动准备
                ret = SendCommands(hWrDev, WR_READY, nGrainType);
                if (ret <= 0)
                {
                    printf("粮食品种修改失败!水分仪故障!\n");
                    ret = WriteState(hPlcDev, DEVICE_WR_FAULT);
                }
                else
                {
                    printf("粮食品种修改成功!准备就绪\n");
                    ret = WriteState(hPlcDev, READY_FINISH);
                }
            }
            break;
            case DETECT_START: //开始测试
            {
                ret = SendCommands(hWrDev, 0x02);
                if (ret <= 0)
                {
                    printf("执行检测失败!\n");
                    ret = WriteState(hPlcDev, DEVICE_WR_FAULT);
                }
                else
                {
                    unsigned short nDatas[10] = { 0 };
                    //从水分仪器读取数据
                    ret = ReadDatas(hWrDev, nDatas);
                    printf("执行检测成功!\n");
                    ret = WriteState(hPlcDev, DETECT_FINISH);
                    //计算水分率
                    double v = coef[0] +
                        coef[1] * nDatas[0] +
                        coef[2] * nDatas[0] * nDatas[0] +
                        coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                        coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                    nDatas[0] = 0x01; // ç²®é£Ÿå“ç§
                    nDatas[1] = v; // 21.30% //含水率
                    nDatas[2] = 5150; // 51.50; //容重比
                    ret = UploadData(hPlcDev, nDatas);
                }
            }
            break;
            case DEVICE_WR_RESET: //复位命令
            {
            }
            break;
            default:
                break;
            }
        }
    }
    if (hPlcDev) DestroyDevice(&hPlcDev);
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动写参数
void ExeWriteParam()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = WriteParams(hWrDev, 50, 100, 50, 12000, 1);
    if (ret <= 0)
        printf("下发参数失败!\n");
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动检测
void ExeManTest()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, WR_READY, 1); //下发确认
    if (ret <= 0)
        printf("准备失败!\n");
    else
    {
        ret = SendCommands(hWrDev, WR_DETECT); //执行启动命令
        if (ret <= 0)
        {
            printf("执行检测失败!\n");
        }
        else
        {
            unsigned short nDatas[10] = { 0 };
            //从水分仪器读取数据
            ret = ReadDatas(hWrDev, nDatas);
            //计算水分率
            double v = coef[0] +
                coef[1] * nDatas[0] +
                coef[2] * nDatas[0] * nDatas[0] +
                coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
            printf(" After Detection,");
            printf(" %d %d %d %d", nDatas[0], nDatas[0], nDatas[0], nDatas[0]);
            printf(" Water Rate:%lf", v);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动校准一组
void ExeVerifyTest()
{
    void* hWrDev = CreateWrDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, 0x01, 0x01); //下发确认
    if (ret <= 0)
    {
        printf("确认失败!\n");
    }
    else
    {
        ret = SendCommands(hWrDev, 0x03); //执行启动命令
        if (ret <= 0)
        {
            printf("校准执行失败!\n");
        }
        else
        {
            unsigned short nVcc = 0;
            //从水分仪器读取数据
            ret = ReadVcc(hWrDev, &nVcc);
            printf(" Detected Val: %d", nVcc);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
//拟合测试--计算校准系数
void TestLinearize()
{
    int nSampeCount = 12;
     float x[]={0,1,2,3,4,5,6,7,8,9,10,11}; //realval
     float y[]={2506,2200,1846,1440,1004,548,79,-387,-847,-1288,-1700,-2066}; //input
     double coef[5] = { 0 };
     int ret = Linearize(x, y, coef, 2, nSampeCount);
     if (ret > 0)
     {
         printf("Coef: %f, %f, %f, %f, %f\n", coef[0], coef[1], coef[2], coef[3], coef[4]);
         float v = 3.0f;
         printf("Input %lf, Cal Val:%lf\n", v,
             (coef[0] +
                 coef[1] * v +
                 coef[2] * v * v +
                 coef[3] * v * v * v +
                 coef[4] * v * v * v * v)
         );
     }
}
int main()
{
    std::cout << "Hello World!\n";
    char ch = 0;
    while ('x' != ( ch = getchar() )) //按 x é€€å‡ºç¨‹åº
    {
        switch (ch)
        {
            case 'a': //自动测试
                ExeTest();
                break;
            case 'p': //向水份仪下发参数
                ExeWriteParam();
                break;
            case 'd': //手动检测
                ExeManTest();
                break;
            case 'v':  //手动校准
                ExeVerifyTest();
                break;
            case 'l': //拟合测试
                TestLinearize();
                break;
            default:
                break;
        }
    }
}
// è¿è¡Œç¨‹åº: Ctrl + F5 æˆ–调试 >“开始执行(不调试)”菜单
// è°ƒè¯•程序: F5 æˆ–调试 >“开始调试”菜单
// å…¥é—¨ä½¿ç”¨æŠ€å·§:
//   1. ä½¿ç”¨è§£å†³æ–¹æ¡ˆèµ„源管理器窗口添加/管理文件
//   2. ä½¿ç”¨å›¢é˜Ÿèµ„源管理器窗口连接到源代码管理
//   3. ä½¿ç”¨è¾“出窗口查看生成输出和其他消息
//   4. ä½¿ç”¨é”™è¯¯åˆ—表窗口查看错误
//   5. è½¬åˆ°â€œé¡¹ç›®â€>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. å°†æ¥ï¼Œè‹¥è¦å†æ¬¡æ‰“开此项目,请转到“文件”>“打开”>“项目”并选择 .sln æ–‡ä»¶
doc/½Ó¿ÚÉè¼Æ/old/ActuatorDemo_old.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,278 @@
// ActuatorDemo.cpp : æ­¤æ–‡ä»¶åŒ…含 "main" å‡½æ•°ã€‚程序执行将在此处开始并结束。
//
#include <iostream>
#include "../Actuator//Actuator.h"
//系数
const double coef[5] = { 1,1,0.01,0,0 };
void ExeTest()
{
    void* hPlcDev = CreateCustDevice("127.0.0.1", 1502);
    void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hPlcDev) ret = ConnectDevice(hPlcDev);
    if (hWrDev) ret = ConnectDevice(hWrDev);
    char ch = 0;
    while ('c' != (ch = getchar()))  //按 c é€€å‡ºè‡ªåŠ¨æ£€æµ‹
    {
        //读PLC状态字
        ret = ReadState(hPlcDev, &nState, &nGrainType);
        if (ret <= 0)
        {
            printf("读取PLC状态字异常!\n");
        }
        else if (nGrainType > 0 && nState > 0)
        {
            switch (nState)
            {
            case 0x01: //粮食品种修改了
            {
                //向水分仪发粮种更改,启动准备
                ret = SendCommands(hWrDev, 0x01, nGrainType);
                if (ret <= 0)
                {
                    printf("粮食品种修改失败!水分仪故障!\n");
                    ret = WriteState(hPlcDev, 0xFF);
                }
                else
                {
                    printf("粮食品种修改成功!准备就绪\n");
                    ret = WriteState(hPlcDev, 0x02);
                }
            }
            break;
            case 0x03: //开始测试
            {
                ret = SendCommands(hWrDev, 0x02);
                if (ret <= 0)
                {
                    printf("执行检测失败!\n");
                    ret = WriteState(hPlcDev, 0xFF);
                }
                else
                {
                    unsigned short nDatas[10] = { 0 };
                    //从水分仪器读取数据
                    ret = ReadDatas(hWrDev, nDatas);
                    printf("执行检测成功!\n");
                    ret = WriteState(hPlcDev, 0x04);
                    //计算水分率
                    double v = coef[0] +
                        coef[1] * nDatas[0] +
                        coef[2] * nDatas[0] * nDatas[0] +
                        coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                        coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
                    nDatas[0] = 0x01; // ç²®é£Ÿå“ç§
                    nDatas[1] = v; // 21.30% //含水率
                    nDatas[2] = 5150; // 51.50; //容重比
                    ret = UploadData(hPlcDev, nDatas);
                }
            }
            break;
            case 0xFE: //复位命令
            {
            }
            break;
            default:
                break;
            }
        }
    }
    if (hPlcDev) DestroyDevice(&hPlcDev);
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动写水分仪参数
void ExeWriteParam()
{
    void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = WriteParams(hWrDev, 50, 100, 50, 12000, 1);
    if (ret <= 0)
        printf("下发参数失败!\n");
    if (hWrDev) DestroyDevice(&hWrDev);
}
//手动检测
void ExeManTest()
{
    void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, 0x01, 0x01); //下发确认
    if (ret <= 0)
        printf("准备失败!\n");
    else
    {
        ret = SendCommands(hWrDev, 0x02); //执行启动命令
        if (ret <= 0)
        {
            printf("执行检测失败!\n");
        }
        else
        {
            unsigned short nDatas[10] = { 0 };
            //从水分仪器读取数据
            ret = ReadDatas(hWrDev, nDatas);
            //计算水分率
            double v = coef[0] +
                coef[1] * nDatas[0] +
                coef[2] * nDatas[0] * nDatas[0] +
                coef[3] * nDatas[0] * nDatas[0] * nDatas[0] +
                coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0];
            printf(" After Detection,");
            printf(" %d %d %d %d", nDatas[0], nDatas[0], nDatas[0], nDatas[0]);
            printf(" Water Rate:%lf", v);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
//
void ExeVerifyTest()
{
    void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1);
    unsigned short nState = 0;
    unsigned short nGrainType = 0;
    int ret = 0;
    if (hWrDev) ret = ConnectDevice(hWrDev);
    ret = SendCommands(hWrDev, 0x01, 0x01); //下发确认
    if (ret <= 0)
    {
        printf("确认失败!\n");
    }
    else
    {
        ret = SendCommands(hWrDev, 0x03); //执行启动命令
        if (ret <= 0)
        {
            printf("校准执行失败!\n");
        }
        else
        {
            unsigned short nVcc=0;
            //从水分仪器读取数据
            ret = ReadScanFreq(hWrDev, &nVcc);
            printf(" After Detection,");
            printf(" %d", nVcc);
            printf(" \n");
        }
    }
    if (hWrDev) DestroyDevice(&hWrDev);
}
void TestLinearize()
{
    int nSampeCount = 12;
     float x[]={1,2,3,4,5}; //电平值mV
     float y[]={2506,2200,1846,1440,1004}; //实测水分值
     double coef[5] = { 0 };
     int ret = Linearize(x, y, coef, 2, nSampeCount);
     if (ret > 0)
     {
         printf("Coef: %f, %f, %f, %f, %f\n", coef[0], coef[1], coef[2], coef[3], coef[4]);
         float v = 7.0f;
         printf("Input %lf, Cal Val:%lf\n", v,
             (coef[0] +
                 coef[1] * v +
                 coef[2] * v * v +
                 coef[3] * v * v * v +
                 coef[4] * v * v * v * v)
         );
     }
}
int main()
{
    std::cout << "Hello World!\n";
    char ch = 0;
    while ('x' != ( ch = getchar() )) //按 x é€€å‡ºç¨‹åº
    {
        switch (ch)
        {
            case 'a': //自动测试
                ExeTest();
                break;
            case 'p': //向水份仪下发参数
                ExeWriteParam();
                break;
            case 'd': //手动检测
                ExeManTest();
                break;
            case 'v':  //校准
                ExeVerifyTest();
                break;
            case 'l': //拟合测试
                TestLinearize();
                break;
            default:
                break;
        }
    }
}
// è¿è¡Œç¨‹åº: Ctrl + F5 æˆ–调试 >“开始执行(不调试)”菜单
// è°ƒè¯•程序: F5 æˆ–调试 >“开始调试”菜单
// å…¥é—¨ä½¿ç”¨æŠ€å·§:
//   1. ä½¿ç”¨è§£å†³æ–¹æ¡ˆèµ„源管理器窗口添加/管理文件
//   2. ä½¿ç”¨å›¢é˜Ÿèµ„源管理器窗口连接到源代码管理
//   3. ä½¿ç”¨è¾“出窗口查看生成输出和其他消息
//   4. ä½¿ç”¨é”™è¯¯åˆ—表窗口查看错误
//   5. è½¬åˆ°â€œé¡¹ç›®â€>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. å°†æ¥ï¼Œè‹¥è¦å†æ¬¡æ‰“开此项目,请转到“文件”>“打开”>“项目”并选择 .sln æ–‡ä»¶
doc/·½°¸Éè¼Æ/Á¸Ê³Ë®·ÖÒÇ-ÏÂλ»úͨѶ¹æÔ¼.docx
Binary files differ
doc/·½°¸Éè¼Æ/Á¸Ê³Ë®·ÖÒÇ-ЭÒé¿ò¼Ü.pptx
Binary files differ
doc/·½°¸Éè¼Æ/Á¸Ê³Ë®·Ö¼ì²âÒÇModinetͨÐÅЭÒéV1.docx
Binary files differ
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.0×Ô¶¯Ä£Ê½-É豸¾ÍÐ÷.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.1×Ô¶¯Ä£Ê½-ÐÞ¸ÄÁ¸ÖÖ.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.2×Ô¶¯Ä£Ê½-ÕýÔÚ¼ì²â.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.3×Ô¶¯Ä£Ê½-¼ì²â³É¹¦.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.4×Ô¶¯Ä£Ê½-PLC´íÎó.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/1.5×Ô¶¯Ä£Ê½-Çл»ÊÖ¶¯-ÊäÈëÃÜÂë.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.1.1ÊÖ¶¯Ä£Ê½-¼ì²â-¼ì²â³É¹¦.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.1.2.1ÊÖ¶¯Ä£Ê½-ÒÇÆ÷ά»¤-¹Ì¼þ°æ±¾.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.1.2ÊÖ¶¯Ä£Ê½-ÒÇÆ÷ά»¤.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.1ÊÖ¶¯Ä£Ê½-¼ì²â.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.2ÊÖ¶¯Ä£Ê½-·ÖÎö.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.3.1ÊÖ¶¯Ä£Ê½-У׼-ÖØÁ¿Ð£×¼.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.3.2.1ÊÖ¶¯Ä£Ê½-У׼-µ÷Õû½Ø¾à-ÐÂÔöÁ¸ÖÖ.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.3.2.2ÊÖ¶¯Ä£Ê½-У׼-µ÷Õû½Ø¾à-ÐÞ¸ÄÁ¸ÖÖ.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.3.2ÊÖ¶¯Ä£Ê½-У׼-µ÷Õû½Ø¾à.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.3ÊÖ¶¯Ä£Ê½-У׼.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.4.1ÊÖ¶¯Ä£Ê½-ÉèÖÃ-ÉèÖÃÉúЧ.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.4ÊÖ¶¯Ä£Ê½-ÉèÖÃ.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/2.ÊÖ¶¯Ä£Ê½.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/3.1ϵͳÐÅÏ¢-±£´æÐÅÏ¢.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/3.ϵͳÐÅÏ¢.png
doc/×îÐÂÉè¼Æ-½çÃæ½ØÍ¼/GMMSoft½ØÍ¼.zip
Binary files differ
doc/Ë®·ÖÒÇÏÂλ»úͨѶ¹æÔ¼ (1).docx
Binary files differ
doc/Á¸Ê³Ë®·ÖÒÇ-ÐèÇóÎĵµV1.1.docx
Binary files differ
readme.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
    ç²®é£Ÿæ°´åˆ†ä»ªä¸Šä½æœºè½¯ä»¶--说明
=====================================
1.英文全称:Grain Moisture Meter Soft,英文缩写:GMMSoft、gmmsoft;
2.软件以上一版组态软件为基础开发,包含自动模式和手动模式;
3.自动模式下,自动获取开始检测指令,自动完成检测任务,自动上报检测结果,自动存储检测数据;
4.手动模式下,分为检测、分析、校准、设置四部分功能;
5.下发粮种指令在手动模式下不再执行抽开挡板动作,自动模式仍然保留;
6.新增重量校准功能模块,使用三次校准法完成 Y = kX + b ç®—法,求解系数k和b;
7.升级 Actuator.dll é€šè®¯é©±åŠ¨å™¨åŠ¨æ€åº“ï¼›
8.新增仪器维护界面,增加复位、读固件版本、阀门开关指令;
9.新增调整截距界面,对每个粮种初次使用前,利用标样进行校准,设置截距对含水率进行修正。
10. æŒ‰å§œç»ç†è¦æ±‚,去掉软件license授权,停用软件防拷贝功能。
11.增加OpenTabTip函数,调用屏幕键盘,并在结束时自动关闭。
12.更改PLC与上位机通讯模式,client->Server方式通讯,更新上位机版本号3.0。
13.去掉手动模式/自动模式下重连仪器的按钮,防止断开水分仪导致故障。
14.新增一个1024X600分辨率的版本,版本号改为V3.1.0.1500。
    ç²®é£Ÿæ°´åˆ†ä»ªä¸Šä½æœºè½¯ä»¶--模拟调试参数
=====================================
1.安装虚拟串口映射工具VSPD,安装串口和tcp调试工具ModbusSlave;
2.GMMSoft需要同时连接串口水分仪和网口PLC;
3.打开ModbusSlave,设置为串口模式,波特率:115200;
4.打开ModbusSlave,设置为TCP模式,IP:127.0.0.1,prot:1502;
    Modbus点位设置:1-(RW)粮种,2-(R)回写粮种,3-(RW)指令(1下发粮种->2返回,3检测->4返回),4-(R)容重比,5-(R)含水率。
res/bottom.jpg
res/icon.ico
res/lanpu.png
res/lanpu48.ico
res/lanpu_log.png
res/logo.png
res/woofunction-icons/Thumbs.db
Binary files differ
res/woofunction-icons/activity_monitor.png
res/woofunction-icons/activity_monitor_add.png
res/woofunction-icons/activity_monitor_chart.png
res/woofunction-icons/activity_monitor_close.png
res/woofunction-icons/activity_monitor_warning.png
res/woofunction-icons/add_16.png
res/woofunction-icons/add_32.png
res/woofunction-icons/address_book_32.png
res/woofunction-icons/address_book_add_32.png
res/woofunction-icons/address_book_close_32.png
res/woofunction-icons/address_book_search_32.png
res/woofunction-icons/address_book_warning_32.png
res/woofunction-icons/arrow_down_16.png
res/woofunction-icons/arrow_down_32.png
res/woofunction-icons/arrow_left_16.png
res/woofunction-icons/arrow_left_32.png
res/woofunction-icons/arrow_right_16.png
res/woofunction-icons/arrow_right_32.png
res/woofunction-icons/arrow_up_16.png
res/woofunction-icons/arrow_up_32.png
res/woofunction-icons/basket_32.png
res/woofunction-icons/basket_add_32.png
res/woofunction-icons/basket_back_32.png
res/woofunction-icons/basket_chart_32.png
res/woofunction-icons/basket_close_32.png
res/woofunction-icons/basket_go_32.png
res/woofunction-icons/basket_search_32.png
res/woofunction-icons/blue_arrow_down_32.png
res/woofunction-icons/blue_arrow_left_32.png
res/woofunction-icons/blue_arrow_right_32.png
res/woofunction-icons/blue_arrow_up_32.png
res/woofunction-icons/book_32.png
res/woofunction-icons/book_add_32.png
res/woofunction-icons/book_bookmarks_32.png
res/woofunction-icons/book_close_32.png
res/woofunction-icons/book_search_32.png
res/woofunction-icons/book_warning_32.png
res/woofunction-icons/camera_32.png
res/woofunction-icons/camera_add_32.png
res/woofunction-icons/camera_close_32.png
res/woofunction-icons/chart_16.png
res/woofunction-icons/chart_32.png
res/woofunction-icons/chart_flipped_16.png
res/woofunction-icons/chart_flipped_32.png
res/woofunction-icons/clock_32.png
res/woofunction-icons/close_16.png
res/woofunction-icons/close_32.png
res/woofunction-icons/comment_32.png
res/woofunction-icons/comment_add_32.png
res/woofunction-icons/comment_page_32.png
res/woofunction-icons/comment_user_32.png
res/woofunction-icons/comment_user_add_32.png
res/woofunction-icons/comment_user_chart_32.png
res/woofunction-icons/comment_user_close_32.png
res/woofunction-icons/comment_user_info_32.png
res/woofunction-icons/comment_user_page_32.png
res/woofunction-icons/comment_user_rss_32.png
res/woofunction-icons/comment_user_search_32.png
res/woofunction-icons/comment_user_warning_32.png
res/woofunction-icons/database_32.png
res/woofunction-icons/database_add_32.png
res/woofunction-icons/database_chart_32.png
res/woofunction-icons/database_close_32.png
res/woofunction-icons/database_page_32.png
res/woofunction-icons/database_search_32.png
res/woofunction-icons/database_warning_32.png
res/woofunction-icons/email_32.png
res/woofunction-icons/email_add_32.png
res/woofunction-icons/email_close_32.png
res/woofunction-icons/email_forward_32.png
res/woofunction-icons/email_reply_32.png
res/woofunction-icons/email_reply_all_32.png
res/woofunction-icons/error_button.png
res/woofunction-icons/error_button_16.png
res/woofunction-icons/folder_32.png
res/woofunction-icons/folder_add_32.png
res/woofunction-icons/folder_chart_32.png
res/woofunction-icons/folder_close_32.png
res/woofunction-icons/folder_page_32.png
res/woofunction-icons/folder_search_32.png
res/woofunction-icons/folder_warning_32.png
res/woofunction-icons/hammer_32.png
res/woofunction-icons/heart_16.png
res/woofunction-icons/heart_32.png
res/woofunction-icons/home_32.png
res/woofunction-icons/home_back_32.png
res/woofunction-icons/home_go_32.png
res/woofunction-icons/info_button_16.png
res/woofunction-icons/info_button_32.png
res/woofunction-icons/lightbulb_32.png
res/woofunction-icons/lightbulb_off_32.png
res/woofunction-icons/lock_32.png
res/woofunction-icons/lock_open_32.png
res/woofunction-icons/newspaper_32.png
res/woofunction-icons/newspaper_add_32.png
res/woofunction-icons/newspaper_close_32.png
res/woofunction-icons/newspaper_info_32.png
res/woofunction-icons/newspaper_rss_32.png
res/woofunction-icons/newspaper_search_32.png
res/woofunction-icons/page_16.png
res/woofunction-icons/page_blank_32.png
res/woofunction-icons/page_blank_add_32.png
res/woofunction-icons/page_blank_chart_32.png
res/woofunction-icons/page_blank_close_32.png
res/woofunction-icons/page_blank_warning_32.png
res/woofunction-icons/page_table_32.png
res/woofunction-icons/page_table_add_32.png
res/woofunction-icons/page_table_chart_32.png
res/woofunction-icons/page_table_close_32.png
res/woofunction-icons/page_table_warning_32.png
res/woofunction-icons/page_text_32.png
res/woofunction-icons/page_text_add_32.png
res/woofunction-icons/page_text_chart_32.png
res/woofunction-icons/page_text_close_32.png
res/woofunction-icons/page_text_warning_32.png
res/woofunction-icons/pencil_32.png
res/woofunction-icons/rss_16.png
res/woofunction-icons/rss_32.png
res/woofunction-icons/save_32.png
res/woofunction-icons/save_download_32.png
res/woofunction-icons/save_upload_32.png
res/woofunction-icons/screen_32.png
res/woofunction-icons/screen_off_32.png
res/woofunction-icons/screwdriver_32.png
res/woofunction-icons/search_32.png
res/woofunction-icons/search_button_16.png
res/woofunction-icons/search_button_32.png
res/woofunction-icons/search_button_green_16.png
res/woofunction-icons/search_button_green_32.png
res/woofunction-icons/search_chart_32.png
res/woofunction-icons/search_warning_32.png
res/woofunction-icons/star_16.png
res/woofunction-icons/star_32.png
res/woofunction-icons/star_off16.png
res/woofunction-icons/star_off_32.png
res/woofunction-icons/tools_32.png
res/woofunction-icons/twitter_16.png
res/woofunction-icons/twitter_32.png
res/woofunction-icons/user_32.png
res/woofunction-icons/user_add_32.png
res/woofunction-icons/user_blue_32.png
res/woofunction-icons/user_business_32.png
res/woofunction-icons/user_business_add_32.png
res/woofunction-icons/user_business_chart_32.png
res/woofunction-icons/user_business_close_32.png
res/woofunction-icons/user_business_info_32.png
res/woofunction-icons/user_business_rss_32.png
res/woofunction-icons/user_business_search_32.png
res/woofunction-icons/user_business_twitter_32.png
res/woofunction-icons/user_business_warning_32.png
res/woofunction-icons/user_close_32.png
res/woofunction-icons/user_info_32.png
res/woofunction-icons/user_rss_32.png
res/woofunction-icons/user_search_32.png
res/woofunction-icons/user_twitter_32.png
res/woofunction-icons/user_warning_32.png
res/woofunction-icons/users_32.png
res/woofunction-icons/users_business_32.png
res/woofunction-icons/warning_16.png
res/woofunction-icons/warning_32.png
res/woofunction-icons/web_layout_32.png
res/woofunction-icons/web_layout_chart_32.png
res/woofunction-icons/web_layout_error_32.png
res/woofunction-icons/web_layout_error_32_add.png
res/woofunction-icons/web_layout_error_32_close.png
res/woofunction-icons/web_layout_info_32.png
res/woofunction-icons/web_layout_rss_32.png
res/woofunction-icons/web_layout_search_32.png
res/woofunction-icons/web_layout_twitter_32.png
res/woofunction-icons/window_app_32.png
res/woofunction-icons/window_app_blank_32.png
res/woofunction-icons/window_app_list_32.png
res/woofunction-icons/window_app_list_add_32.png
res/woofunction-icons/window_app_list_chart_32.png
res/woofunction-icons/window_app_list_close_32.png
res/woofunction-icons/window_app_list_error_32.png
res/woofunction-icons/window_app_list_info_32.png
res/woofunction-icons/window_app_list_search_32.png
res/ÒÇÆ÷ά»¤/0.ÒÇÆ÷ά»¤_48.bmp
res/ÒÇÆ÷ά»¤/1.ÒÇÆ÷¸´Î».bmp
res/ÒÇÆ÷ά»¤/2.¹Ì¼þ°æ±¾.bmp
res/ÒÇÆ÷ά»¤/3.¿ª¶¯×÷.bmp
res/ÒÇÆ÷ά»¤/4.¹Ø¶¯×÷.bmp
res/¶¯Ì¬Í¼±ê/loading.gif
res/¶¯Ì¬Í¼±ê/ÏÂÔØ¼ÓÔØ.mp4
Binary files differ
res/¶¯Ì¬Í¼±ê/¼ÓÔØloading2.mp4
Binary files differ
res/¶¯Ì¬Í¼±ê/¼ÓÔØloading5.mp4
Binary files differ
res/¶¯Ì¬Í¼±ê/Ô²ÐÎ-1.mp4
Binary files differ
res/¶¯Ì¬Í¼±ê/Ô²ÐÎ-7.mp4
Binary files differ
res/µ¼º½Ìõ.jpg
res/ÊÖ¶¯Í¼±ê/11ÐÂÔö.bmp
res/ÊÖ¶¯Í¼±ê/12ÐÞ¸Ä.bmp
res/ÊÖ¶¯Í¼±ê/13ɾ³ý.bmp
res/ÊÖ¶¯Í¼±ê/14Éý.bmp
res/ÊÖ¶¯Í¼±ê/15½µ.bmp
res/ÊÖ¶¯Í¼±ê/1×¼±¸.bmp
res/ÊÖ¶¯Í¼±ê/2¼ì²â.bmp
res/ÊÖ¶¯Í¼±ê/2¼ì²â32.png
res/ÊÖ¶¯Í¼±ê/3¼ÆËã.bmp
res/ÊÖ¶¯Í¼±ê/3¼ÆËã1.bmp
res/ÊÖ¶¯Í¼±ê/4±£´æ.bmp
res/ÊÖ¶¯Í¼±ê/5²ÎÊýÉúЧ.bmp
res/ÊÖ¶¯Í¼±ê/6Çл».png
res/ÊÖ¶¯Í¼±ê/6Îļþ¼Ð.bmp
res/ÊÖ¶¯Í¼±ê/7OSK24.bmp
res/ÊÖ¶¯Í¼±ê/7È¥Æ¤ÖØ32.png
res/ÊÖ¶¯Í¼±ê/8¼ì²â32.png
res/ÊÖ¶¯Í¼±ê/9²âÊÔ.png
res/ÊÖ¶¯Í¼±ê/OSK.ico
res/ÊÖ¶¯Í¼±ê/×îС»¯Í¼Æ¬.ico
res/ģʽͼ±ê/ÐÞ¸Ä32.bmp
res/ģʽͼ±ê/ɾ³ý20.bmp
res/ģʽͼ±ê/ɾ³ý32.bmp
res/ģʽͼ±ê/½Ø¾à.png
res/ģʽͼ±ê/½Ø¾à1.png
res/ģʽͼ±ê/½Ø¾à48.bmp
res/ģʽͼ±ê/ÊÖдͼ±ê_64.ico
res/ģʽͼ±ê/ÊÖ¶¯.png
res/ģʽͼ±ê/ÊÖ¶¯48.bmp
res/ģʽͼ±ê/ÊÖ¶¯Ä£Ê½.ico
res/ģʽͼ±ê/ÐÂÔö.png
res/ģʽͼ±ê/ÐÂÔö32.bmp
res/ģʽͼ±ê/È·ÈÏ32.bmp
res/ģʽͼ±ê/³ÆÖØ.png
res/ģʽͼ±ê/³ÆÖØ1.png
res/ģʽͼ±ê/³ÆÖØ48.png
res/ģʽͼ±ê/×Ô¶¯.png
res/ģʽͼ±ê/×Ô¶¯48.bmp
res/ģʽͼ±ê/×Ô¶¯Ä£Ê½.ico
res/ģʽͼ±ê/·µ»Ø.png
res/ģʽͼ±ê/·µ»Ø48.bmp
res/±³¾°Í¼.jpg
res/¼ÆËãÆ÷/1Í˳ö.png
res/¼ÆËãÆ÷/1Í˳ö32.png
res/¼ÆËãÆ÷/2»Ø³µ.png
res/¼ÆËãÆ÷/2»Ø³µ48.png
res/¼ÆËãÆ÷/3ESC.png
res/¼ÆËãÆ÷/3ESC48.png
res/¼ÆËãÆ÷/4DEL.png
res/¼ÆËãÆ÷/4Del48.png
res/°¢Àïͼ±ê/27JÍ£Ö¹.png
res/°¢Àïͼ±ê/901Ѳ¼ì¡¢¼ìÑé.png
res/°¢Àïͼ±ê/biz-test.png
res/°¢Àïͼ±ê/hydraulic-oil-temperature.png
res/°¢Àïͼ±ê/ic_Һλ´«¸ÐÆ÷.png
res/°¢Àïͼ±ê/setting.png
res/°¢Àïͼ±ê/test (1).png
res/°¢Àïͼ±ê/test (2).png
res/°¢Àïͼ±ê/test (3).png
res/°¢Àïͼ±ê/test (4).png
res/°¢Àïͼ±ê/test.png
res/°¢Àïͼ±ê/·Ö²¼·ÖÎö.png
res/°¢Àïͼ±ê/·ÖÎö (1).png
res/°¢Àïͼ±ê/·ÖÎö (2).png
res/°¢Àïͼ±ê/·ÖÎö (3).png
res/°¢Àïͼ±ê/·ÖÎö (4).png
res/°¢Àïͼ±ê/·ÖÎö (5).png
res/°¢Àïͼ±ê/·ÖÎö-copy.png
res/°¢Àïͼ±ê/·ÖÎö.png
res/°¢Àïͼ±ê/·ÖÎö_·ÖÎö.png
res/°¢Àïͼ±ê/·ÖÎö±¨±í.png
res/°¢Àïͼ±ê/·ÖÎöͳ¼Æ.png
res/°¢Àïͼ±ê/Çл» (1).png
res/°¢Àïͼ±ê/Çл».png
res/°¢Àïͼ±ê/²ÎÊýÉèÖà (1).png
res/°¢Àïͼ±ê/²ÎÊýÉèÖà (2).png
res/°¢Àïͼ±ê/²ÎÊýÉèÖÃ.png
res/°¢Àïͼ±ê/Æô¶¯ (1).png
res/°¢Àïͼ±ê/Æô¶¯.png
res/°¢Àïͼ±ê/´¹Ö±Ð£×¼.png
res/°¢Àïͼ±ê/Ѳ¼ì¡¢¼ìÑé.png
res/°¢Àïͼ±ê/ÒѼìÑé.png
res/°¢Àïͼ±ê/¿ªÊ¼.png
res/°¢Àïͼ±ê/´ý¼ìÑé.png
res/°¢Àïͼ±ê/ÊÖ¶¯.png
res/°¢Àïͼ±ê/Êý¾ÝУ׼.png
res/°¢Àïͼ±ê/·½ÏòУ׼_direction-adjustment.png
res/°¢Àïͼ±ê/ÔÝÍ£.png
res/°¢Àïͼ±ê/À´ÁÏÆ·ÖʼìÑé.png
res/°¢Àïͼ±ê/У׼ (1).png
res/°¢Àïͼ±ê/У׼ (2).png
res/°¢Àïͼ±ê/У׼ (3).png
res/°¢Àïͼ±ê/У׼.png
res/°¢Àïͼ±ê/¼ì²â.png
res/°¢Àïͼ±ê/¼ì²â²úÆ·_48.png
res/°¢Àïͼ±ê/Ñõµª.png
res/°¢Àïͼ±ê/ˮƽУ׼.png
res/°¢Àïͼ±ê/¾¯½çˮλ.png
res/°¢Àïͼ±ê/¼ÆÁ¿É豸У׼¹¤µ¥.png
res/°¢Àïͼ±ê/Éè Öà (1).png
res/°¢Àïͼ±ê/Éè ÖÃ-Ê÷²Ëµ¥ÉèÖÃ.png
res/°¢Àïͼ±ê/Éè ÖÃ.png
res/°¢Àïͼ±ê/É豸У׼.png
res/°¢Àïͼ±ê/ÉèÖà (1).png
res/°¢Àïͼ±ê/ÉèÖà (2).png
res/°¢Àïͼ±ê/ÉèÖà (3).png
res/°¢Àïͼ±ê/ÉèÖà .png
res/°¢Àïͼ±ê/ÉèÖÃ.png
res/Ê×ҳͼ±ê/1¼ì²â.bmp
res/Ê×ҳͼ±ê/1¼ì²â.png
res/Ê×ҳͼ±ê/2·ÖÎö.bmp
res/Ê×ҳͼ±ê/2·ÖÎö.png
res/Ê×ҳͼ±ê/3У׼.bmp
res/Ê×ҳͼ±ê/3У׼.png
res/Ê×ҳͼ±ê/4ÉèÖÃ.bmp
res/Ê×ҳͼ±ê/4ÉèÖÃ.png
res/Ê×ҳͼ±ê/5Í˳ö.png
res/Ê×ҳͼ±ê/5Í˳ö48.png
res/Ê×ҳͼ±ê/6ÐÅÏ¢.png
res/Ê×ҳͼ±ê/6ÐÅÏ¢48.png
res/Ê×ҳͼ±ê/7ÍøÂç48.png
res/Ê×ҳͼ±ê/ÍøÂçÁ¬½Ó.png
src/GMMSoft.cfg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-E"..\bin"
-N"..\dcu"
-LE"..\dcu"
-LN"..\dcu"
-U"..\dcu"
-O"..\dcu"
-I"..\dcu"
-R"..\dcu"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
src/GMMSoft.dof
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,166 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=..\bin
UnitOutputDir=..\dcu
PackageDLLOutputDir=..\dcu
PackageDCPOutputDir=..\dcu
SearchPath=..\dcu
Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;Rave50CLX;Rave50VCL;dclOfficeXP;JclDeveloperTools;JclVcl;JvCore;JvSystem;JvStdCtrls;JvDB;JvDlgs;JvControls;JvCmp;JvCrypt;JvCustom;JvDocking;JvDotNetCtrls;JvGlobus;JvHMI;JvJans;JvManagedThreads;JvMM;JvNet;JvPageComps;JvPascalInterpreter;JvPluginSystem;JvPrintPreview;JvRuntimeDesign;JvTimeFramework;JvWizards;JvXPCtrls;RaizeComponentsVcl;RaizeComponentsVclDb;acntD7_R;AlphaDB7;CPortLib7;CoolTrayIcon_D6plus;DXStringOnlyD7;EhLib70;EStringGrid50;iocomp70;nrcommd7;dacvcl70;dac70;odacvcl70;odac70;oraprov70;IndyCore70;IndySystem70;IndyProtocols70;EhLibDataDrivers70
Conditionals=
DebugSourceDirs=..\dcu
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=D:\Program Files\Borland\Delphi7\Bin\
[Version Info]
IncludeVerInfo=1
AutoIncBuild=1
MajorVer=3
MinorVer=1
Release=0
Build=1501
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=2052
CodePage=936
[Version Info Keys]
CompanyName=上海兰宝传感科技股份有限公司
FileDescription=粮食水分仪软件
FileVersion=3.1.0.1501
InternalName=GMMSoft
LegalCopyright=Copyright(C)2023-2025 ä¸Šæµ·å…°å® ç‰ˆæƒæ‰€æœ‰
LegalTrademarks=上海兰宝
OriginalFilename=GMMSoft.exe
ProductName=GMMSoft
ProductVersion=3.1
Comments=李良庭 2025-07-08 æœ€åŽç¼–译
[Excluded Packages]
d:\program files\borland\delphi7\Projects\Bpl\dclfrxADO7.bpl=FastReport 4.0 ADO Components
d:\program files\borland\delphi7\Projects\Bpl\dclfrxBDE7.bpl=FastReport 4.0 BDE Components
d:\program files\borland\delphi7\Projects\Bpl\dclfrxcs7.bpl=FastReport 4.0 Client/Server Components
d:\program files\borland\delphi7\Projects\Bpl\dclfrx7.bpl=FastReport 4.0 Components
d:\program files\borland\delphi7\Projects\Bpl\dclfrxDB7.bpl=FastReport 4.0 DB Components
d:\program files\borland\delphi7\Projects\Bpl\dclfrxe7.bpl=FastReport 4.0 Exports
d:\program files\borland\delphi7\Projects\Bpl\dclfrxTee7.bpl=FastReport 4.0 Tee Components
d:\program files\borland\delphi7\Projects\Bpl\dclfs7.bpl=FastScript 1.9 Components
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=..\dcu
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=..\dcu
[HistoryLists\hlUnitOutputDirectory]
Count=1
Item0=..\dcu
[HistoryLists\hlOutputDirectorry]
Count=1
Item0=..\bin
[HistoryLists\hlBPLOutput]
Count=1
Item0=..\dcu
[HistoryLists\hlDCPOutput]
Count=1
Item0=..\dcu
src/GMMSoft.dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
program GMMSoft;
uses
  //MultInst in 'pub\MultInst.pas',
  Forms,
  uMain in 'uMain.pas' {frmMain},
  SQLite3 in 'sqlite3\SQLite3.pas',
  sqlite3udf in 'sqlite3\sqlite3udf.pas',
  SQLiteTable3 in 'sqlite3\SQLiteTable3.pas',
  Global in 'pub\Global.pas',
  MsgVar in 'pub\MsgVar.pas',
  PubUtils in 'pub\PubUtils.pas',
  log4me in 'log\log4me.pas',
  uInit in 'init\uInit.pas',
  uDM in 'uDM.pas' {dm: TDataModule},
  uCalc in 'uCalc.pas' {frmCalc},
  ActuatorLib in 'lib\ActuatorLib.pas',
  uSaveData in 'uSaveData.pas',
  mantestThread in 'thread\mantestThread.pas',
  verifyThread in 'thread\verifyThread.pas',
  UntDes in 'pub\UntDes.pas',
  CpuidInfo in 'pub\CpuidInfo.pas',
  grainThread in 'thread\grainThread.pas',
  interceptThread in 'thread\interceptThread.pas',
  resetThread in 'thread\resetThread.pas',
  uTablet in 'uTablet.pas' {frmTablet},
  uInput in 'uInput.pas' {frmInput},
  testThread in 'thread\testThread.pas';
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(Tdm, dm);
  Application.Run;
end.
src/GMMSoft.res
Binary files differ
src/GMMSoft.~dpr
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
program GMMSoft;
uses
  MultInst in 'pub\MultInst.pas',
  Forms,
  uMain in 'uMain.pas' {frmMain},
  SQLite3 in 'sqlite3\SQLite3.pas',
  sqlite3udf in 'sqlite3\sqlite3udf.pas',
  SQLiteTable3 in 'sqlite3\SQLiteTable3.pas',
  Global in 'pub\Global.pas',
  MsgVar in 'pub\MsgVar.pas',
  PubUtils in 'pub\PubUtils.pas',
  log4me in 'log\log4me.pas',
  uInit in 'init\uInit.pas',
  uDM in 'uDM.pas' {dm: TDataModule},
  uCalc in 'uCalc.pas' {frmCalc},
  ActuatorLib in 'lib\ActuatorLib.pas',
  testThread in 'thread\testThread.pas',
  uSaveData in 'uSaveData.pas',
  mantestThread in 'thread\mantestThread.pas',
  verifyThread in 'thread\verifyThread.pas',
  UntDes in 'pub\UntDes.pas',
  CpuidInfo in 'pub\CpuidInfo.pas',
  grainThread in 'thread\grainThread.pas',
  interceptThread in 'thread\interceptThread.pas',
  resetThread in 'thread\resetThread.pas',
  uTablet in 'uTablet.pas' {frmTablet};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(Tdm, dm);
  Application.CreateForm(TfrmTablet, frmTablet);
  Application.Run;
end.
src/init/uInit.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,616 @@
{------------------------------------------------------------------------------}
{单元名称:uInit.pas                                                           }
{模块名称:初始化函数库                                                        }
{模块说明:包括主进程启动时,全局变量初始化、系统目录初始化、配置加载          }
{建立日期:2009-12-20                                                          }
{修改修改:2023-02-21                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit uInit;
interface
uses
  Windows, Classes, Messages, Forms, Dialogs, SysUtils, StrUtils, DateUtils,
  StdCtrls, Variants, ComCtrls, Buttons, Math, IniFiles, Graphics, ShellAPI,
  SQLite3, SQLiteTable3;
  {申明全局公共调用函数}
  procedure OpenOnScreenKeyboard();
  procedure InitGlobal();
  procedure InitSystemDir();
  procedure InitDatas();
  procedure LoadSystemInfo();
  procedure LoadOptions();
  procedure SaveOptions();
  function GetCurrMsgPos(index:Integer):TPoint;
  //授权文件检查模块
  function GetMachineCode():String;
  function CheckLicense(sFilename, sCode:String):Boolean;
  procedure RegCheckMode();
  procedure RegCheck1Mode();
  //保存csv数据
  procedure WriteCsvFile(name: string; mois,temp,water: Double);
  //刷新故障码
  function RefashFaultCode(cod:Integer):String;
  //自动模式下刷新故障码
  function AutoFaultCode(cod:Integer):string;
implementation
uses
  uMain, log4me, uDM, PubUtils, MsgVar, Global, uSaveData, CpuidInfo, UntDes;
  {函数方法}
//------- è°ƒç”¨ä¸‰æ–¹é”®ç›˜ ------------------------------------
//调用osk键盘
procedure OpenOnScreenKeyboard();
type TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
type TWow64RevertWow64FsRedirection = function(var Wow64RevertWow64FsRedirection: LongBool): LongBool; StdCall;
var
  hHandle: THandle;
  Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
  Wow64RevertWow64FsRedirection: TWow64RevertWow64FsRedirection;
  OldValue: LongBool;
  rs: Integer;
begin
  //切换32位文件系统
  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
    if ((hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then
      Wow64DisableWow64FsRedirection(OldValue);
  except
  end;
  //调用osk屏幕键盘
  rs := ShellExecute(Application.Handle, 'open', 'osk.exe', nil, nil, SW_SHOWNORMAL);
  if rs <= 32 then begin
    ShowMessage(Format('错误:无法打开屏幕键盘,错误代码-[%d].',[rs]));
    log4Info(Format('错误:无法打开屏幕键盘,错误代码-[%d].',[rs]));
  end
  else
    log4Info('系统:上位机软件打开 osk ç³»ç»Ÿå±å¹•键盘.');
  //用回64位文件系统
  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64RevertWow64FsRedirection := GetProcAddress(hHandle, 'Wow64RevertWow64FsRedirection');
    if ((hHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then
      Wow64RevertWow64FsRedirection(OldValue);
  except
  end;
end;
//---------------------------------------------------------------------------
//初始化全局变量
procedure InitGlobal();
begin
  //程序路径
  glAppPath := ExtractFilePath(Application.ExeName);
  //configDB file
  glConfig_db := glAppPath + CONFIG_DIR + t_Config + '.db';
  glConn_db   := glAppPath + CONFIG_DIR + t_Conn + '.db';
  glGrain_db  := glAppPath + CONFIG_DIR + t_Grain + '.db';
  glWeight_db := glAppPath + CONFIG_DIR + t_Weight + '.db';
  glManager_db := glAppPath + CONFIG_DIR + t_Manager + '.db';
  glData_db   := glAppPath + CONFIG_DIR + t_Data + '.db';
  //初始化Calc全局变量
  glCalcOutput := '';
  glCurrFocus  := 0;
  //初始化手动模式返回口令值
  frmMain.sLoginPwd := '';
  //初始化样本存储变量
  smp.flag := false;
  smp.info := '';
  smp.prefix := '';
  smp.dir := '';
end;
//初始化系统目录
procedure InitSystemDir();
var
  path : String;
begin
  //创建配置文件夹
  path := glAppPath + CONFIG_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
  //创建数据文件夹
  path := glAppPath + DATA_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
  //创建日志文件夹
  path := glAppPath + LOG_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
end;
//初始化数据采集结构
procedure InitDatas();
begin
  //初始化Datas测量数据
  Datas.Voltage := 0;   //原始电平
  Datas.Weight := 0;    //重量
  Datas.Temp := 0;      //温度
  Datas.Humid:= 0;      //湿度
  //初始化自动检测标签
  frmMain.lblAutoRet.Caption := '';
  frmMain.lblAutoRet_error.Caption := '';
end;
//加载系统信息界面
procedure LoadSystemInfo();
begin
  with frmMain do begin
    //初始化水分仪串口下拉菜单
    cbSerialPort.Items.Clear;
    EnumComPorts(cbSerialPort.Items);
    //加载水分仪参数
    cbSerialPort.Text := WrConn.SerialPort;
    edtBaud.Text := IntToStr(WrConn.baud);
    edtParity.Text := WrConn.parity;
    edtData_bit.Text := IntToStr(WrConn.data_bit);
    edtStop_bit.Text := IntToStr(WrConn.stop_bit);
    cbAutoRun.Checked := glAutoRun;
    //增加两个时间设置值
    edtTime1.Text := IntToStr(glTime1);
    edtTime2.Text := IntToStr(glTime2);
    //加载扦捡系统参数
    edtIP.Text := PlcConn.ip;
    edtPort.Text := IntToStr(PlcConn.port);
    edtHeartIP.Text := PlcConn.heart_ip;
    edtHeartPort.Text := IntToStr(PlcConn.heart_port);
    //加载手动检测和参数配置界面的数据存储参数
    cbTestAutoSave.Checked := smp.flag;
    edtSampleName.Text := smp.info;
    cbAutoSave.Checked := smp.flag;
    edtPrefix.Text := smp.prefix;
    edtDir.Text := smp.dir;
    //加载登录口令
    edtPassword.Text := SysConfig.password;
    edtDelay.Text := IntToStr(SysConfig.delay);
  end;
end;
//加载参数到界面
procedure LoadOptions();
begin
  with frmMain do begin
    //手动检测界面
    mtManClock.Value := 0;
    edtMoisture.Text := '';
    edtWeightRatio.Text := '';
    edtWeight.Text := '';
    edtTemp.Text := '';
    edtWater.Text := '';
    lbType.ItemIndex := Grain.Code-1; //粮种代码与界面ItemIndex的对应关系
    sLabel15.Caption := Format('粮食种类 - [%s]',[Grain.Name]);
    sLabel3.Caption := Format('选择 - [%s]',[Grain.Name]);
    //仪器校准界面
    lbType1.ItemIndex := Grain.Code-1;
    edtAutoCoef1.Text := Grain.coef[0];
    edtAutoCoef2.Text := Grain.coef[1];
    edtAutoCoef3.Text := Grain.coef[2];
    edtAutoCoef4.Text := Grain.coef[3];
    edtAutoCoef5.Text := Grain.coef[4];
    //参数设置界面
    edtVolume.Text := FloatToStr(SysConfig.Volume);
    edtTare.Text := FloatToStr(SysConfig.Tare);
    edtFreq.Text := FloatToStr(SysConfig.Freq);
    edtDecay.Text:= FloatToStr(SysConfig.Decay);
    edtStartFreq.Text := FloatToStr(SysConfig.StartFreq);
    edtStopFreq.Text := FloatToStr(SysConfig.StopFreq);
    edtStep.Text := IntToStr(SysConfig.Step);
    lbASK.ItemIndex := SysConfig.Ask;  //ASK代码与界面ItemIndex的对应关系
    //系统信息界面
    lblVersion.Caption := Format('版本 %s ', [glFileVersion]);
  end;
end;
//保存界面参数
procedure SaveOptions();
begin
  //
end;
//------ åŠŸèƒ½å‡½æ•° -------------------------------------------------------------
//获取当前焦点输入框的绝对坐标
function GetCurrMsgPos(index:Integer):TPoint;
var
  x1,y1 : Integer;  //修正值
  x3,x45,y2 : Integer;
begin
  with frmMain do begin
    x1 := edtMois1.Width + 5;
    y1 := -100;
    x3 := edtMois1.Width - 8;
    x45 := -473;
    y2  := -250;
    case index of
      1:begin
        Result.X := Left+edtMois1.Left+x1;
        Result.Y := Top+edtMois1.Top+y1;
      end;
      2:begin
        Result.X := Left+edtMois2.Left+x1;
        Result.Y := Top+edtMois2.Top+y1;
      end;
      3:begin
        Result.X := Left+edtMois3.Left+x3;
        Result.Y := Top+edtMois3.Top+y1;
      end;
      4:begin
        Result.X := Left+edtMois4.Left+x45;
        Result.Y := Top+edtMois4.Top+y1;
      end;
      5:begin
        Result.X := Left+edtMois5.Left+x45;
        Result.Y := Top+edtMois5.Top+y1;
      end;
      6:begin
        Result.X := Left+edtManCoef1.Left+x1;
        Result.Y := Top+edtManCoef1.Top+y2;
      end;
      7:begin
        Result.X := Left+edtManCoef2.Left+x1;
        Result.Y := Top+edtManCoef2.Top+y2;
      end;
      8:begin
        Result.X := Left+edtManCoef3.Left+x3;
        Result.Y := Top+edtManCoef3.Top+y2;
      end;
      9:begin
        Result.X := Left+edtManCoef4.Left+x45;
        Result.Y := Top+edtManCoef4.Top+y2;
      end;
      10:begin
        Result.X := Left+edtManCoef5.Left+x45;
        Result.Y := Top+edtManCoef5.Top+y2;
      end;
      11:begin
        Result.X := Left+edtIp.Left+edtIp.Width+35;
        Result.Y := Top+edtIp.Top+edtIp.Height+70;
      end;
      12:begin
        Result.X := Left+edtPort.Left+edtPort.Width+30;
        Result.Y := Top+edtPort.Top+edtPort.Height+70;
      end;
      13:begin
        Result.X := Left+edtTime1.Left+edtTime1.Width+35;
        Result.Y := Top+edtTime1.Top+edtTime1.Height+190;
      end;
      14:begin
        Result.X := Left+edtTime2.Left+edtTime2.Width+35;
        Result.Y := Top+edtTime2.Top+edtTime2.Height+190;
      end;
      15:begin
        Result.X := Left+edtWeight1.Left+edtWeight1.Width+5;
        Result.Y := Top+edtWeight1.Top+edtWeight1.Height-50;
      end;
      16:begin
        Result.X := Left+edtWeight2.Left+edtWeight2.Width+5;
        Result.Y := Top+edtWeight2.Top+edtWeight2.Height-50;
      end;
      17:begin
        Result.X := Left+edtWeight3.Left-475;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-50;
      end;
      18:begin
        Result.X := Left+edtWeight3.Left-220;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-120;
      end;
      19:begin
        Result.X := Left+edtWeight3.Left-220;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-60;
      end;
      20:begin
        Result.X := Left+edtVolume.Left+edtVolume.Width+5;
        Result.Y := Top+edtVolume.Top+edtVolume.Height-45;
      end;
      21:begin
        Result.X := Left+edtTare.Left+edtTare.Width+5;
        Result.Y := Top+edtTare.Top+edtTare.Height-45;
      end;
      22:begin
        Result.X := Left+edtDelay.Left+edtDelay.Width+35;
        Result.Y := Top+edtDelay.Top+edtDelay.Height+140;
      end;
      23:begin
        Result.X := Left+edtPassword.Left+35;
        Result.Y := Top+edtPassword.Top+210;
      end;
      24:begin
        Result.X := Left+edtManVal.Left+x1;
        Result.Y := Top+edtManVal.Top-120;
      end;
      25:begin
        Result.X := Left+edtIntercept.Left+x1;
        Result.Y := Top+edtIntercept.Top-180;
      end;
      26:begin
        Result.X := Left+edtHeartIp.Left+40;
        Result.Y := Top+edtHeartIp.Top+120;
      end;
      27:begin
        Result.X := Left+edtHeartPort.Left+40;
        Result.Y := Top+edtHeartPort.Top+120;
      end;
    end;
  end;
end;
//------- ç³»ç»ŸæŽˆæƒç›¸å…³å‡½æ•° -----------------------------------------------------
//计算本机机器码,输出机器码密文
function GetMachineCode():String;
var
  ss : string;
begin
  SetCPU(GetCurrentProcess,1);
  ss := GetCnCPUID();
  //生成一个机器码
  Result := EncryStrHex(ss, sConfig);
end;
//授权文件校验,返回校验结果
//入参:sfilename-校验文件
//      sCode-计算本机机器码
//返回:true-校验成功;false-校验失败
function CheckLicense(sFilename, sCode:String):Boolean;
var
  i : Integer;
  sDecry : String;  //解密后的明文
  sl : TStringList;
begin
  //容错处理
  if not FileExists(sFileName) then begin
    Result := false;
    Exit;
  end;
  //获取密文
  sl := TStringlist.Create();
  try
    sl.LoadFromFile(sFilename);
    sDecry := Trim(sl.Text);
  finally
    FreeAndNil(sl);
  end;
  //对密文信息进行解码,按默认level=8
  for i:=1 to 8 do
    sDecry := DecryStrHex(sDecry, sConfig); //编码,生成明文
  //获取RegCode+RegDate+RegLevel+RegType+RegKey æœºå™¨ç 
  sDESMachineCode := SplitStr(sDecry,' ',0);
  sDESDate := SplitStr(sDecry,' ',1);
  sDESLevel := SplitStr(sDecry,' ',2);
  sDESType := SplitStr(sDecry,' ',3);
  sDESKey := SplitStr(sDecry,' ',4);
  //返回比较机器码
  Result := AnsiSameStr(sCode, sDESMachineCode);
end;
//License授权检查模块,如未注册则自动退出
procedure RegCheckMode();
var
  sl : TStringList;
  sLicFile, sMchCod, sLicText : String;
begin
  //======验证授权文件===============================
  sLicFile := glAppPath + LICENSE_FILE;
  sMchCod := GetMachineCode();
  if CheckLicense(sLicFile, sMchCod) then
    glRegSuccess := true
  else begin
    //存注册码
    sl := TStringList.Create();
    sl.Add('机器码:' + sMchCod);
    sl.Add('生成日期:' + FormatDateTime('yyyy-mm-dd hh:nn:ss',Now()));
    sl.SaveToFile(glAppPath+'机器码.txt');
    FreeAndNil(sl);
    //提示要获取授权文件
    glRegSuccess := false;  //注册失败,调整标志,准备释放退出定时器
    sLicText := '警告:系统尚未注册,已在软件目录生成 [机器码] æ–‡ä»¶ï¼Œè¯·å°†è¯¥æ–‡ä»¶æä¾›ç»™ç³»ç»Ÿä¾›åº”商,以获取正式授权文件!';
    MessageBox(frmMain.handle,PChar(sLicText),'注册提示对话框',MB_OK+MB_ICONWARNING);
    //开启退出定时器, 0.5s内退出
    dm.tmRegFault.Enabled := true;
  end;
end;
//静默授权检查模块
procedure RegCheck1Mode();
var
  sLicFile, sMchCod : String;
begin
  sLicFile := glAppPath + LICENSE_FILE;
  sMchCod := GetMachineCode();
  if not CheckLicense(sLicFile, sMchCod) then
    dm.tmRegFault.Enabled := true;
end;
//------------------------------------------------------------------------------
function GetLastNum(const FileName: string): Integer;
var
  FileStream: TextFile;
  LastDataLine,Line,Fields: string;
begin
  Result := 0;
  // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦å­˜åœ¨
  if not FileExists(FileName) then Exit;
  // æ‰“开文件
  AssignFile(FileStream, FileName);
  try
    Reset(FileStream);
    // è·³è¿‡æ ‡é¢˜è¡Œ
    if not Eof(FileStream) then ReadLn(FileStream);
    // è¯»å–文件的每一行
    LastDataLine := '';
    while not Eof(FileStream) do begin
      ReadLn(FileStream, Line);
      if Line <> '' then
        LastDataLine := Trim(Line);
    end;
    // è§£æžæœ€åŽä¸€è¡Œ
    if LastDataLine <> '' then begin
      Fields := SplitStr(LastDataLine,',',0);
      Result := StrToIntDef(Fields,0);
    end;
  finally
    CloseFile(FileStream);
  end;
end;
// å°†æ£€æµ‹ç»“果保存到 csv文件
procedure WriteCsvFile(name: string; mois,temp,water: Double);
var
  pMyFile: textFile;
  sfile,sTitle,sMsg,time : string;
  no : integer;
begin
  //初始化路径和标题
  sFile := smp.dir + smp.prefix + FormatDateTime('yyyymmdd', Now) + '.csv';
  sTitle:= '序号,样本信息,含水率,温度,湿度,日期';
  //读取文件历史no序号
  no := GetLastNum(sFile)+1;
  time := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
  sMsg  := Format('%d,%s,%.2f,%.2f,%.2f,%s', [no,name,mois,temp,water,time]);
  try
    AssignFile(pMyFile,sFile);
    if FileExists(sFile) then
      Append(pMyFile)
    else begin
      ReWrite(pMyFile);
      WriteLn(pMyFile,sTitle); //新建csv,先写入标题
    end;
    WriteLn(pMyFile,sMsg);     //写入内容
  finally
    CloseFile(pMyFile);
  end;
end;
//刷新设备故障码
function RefashFaultCode(cod:Integer):string;
var
  str : string;
begin
  //翻译cod
  case cod of
    -1:str := '通讯故障';
    0: str := '正常';
    1: str := '上阀门关故障';
    2: str := '下阀门关故障';
    3: str := '双阀门关故障';
    4: str := '上阀门开故障';
    5: str := '上阀门开关故障';
    6: str := '上阀门开、下阀门关故障';
    7: str := '上阀门开关、下阀门关故障';
    8: str := '下阀门开故障';
    9: str := '下阀门开、上阀门关故障';
    10: str := '下阀门开关故障';
    11: str := '下阀门开关、上阀门关故障';
    12: str := '双阀门开故障';
    13: str := '上阀门开关、下阀门开故障';
    14: str := '下阀门开关、上阀门开故障';
    15: str := '双阀门开关故障';
    16: str := '没有粮食在漏斗中';
    32: str := '抽屉没有放好';
    256:str := '故障重启';
    else str := '故障未定义';
  end;
  //返回故障字符串
  result := str;
  //输出到界面
  with frmMain do begin
    sLabel72.Caption := Format('设备状态-[%s]',[str]);    //更新调整截距界面
    sLabel73.Caption := Format('设备状态-[%s]',[str]);    //更新手动检测界面
    sLabel74.Caption := Format('设备状态-[%s]',[str]);    //更新自动模式界面
    sLabel75.Caption := Format('设备状态-[%s]',[str]);    //更新手动校准界面
    sLabel76.Caption := Format('设备状态-[%s]',[str]);    //更新手动模式界面
    sLabel77.Caption := Format('设备状态-[%s]',[str]);    //更新仪器维护界面
    //修改样式
    if cod=0 then begin
      sLabel72.Font.Color := clLime;
      sLabel73.Font.Color := clLime;
      sLabel74.Font.Color := clLime;
      sLabel75.Font.Color := clLime;
      sLabel76.Font.Color := clLime;
      sLabel77.Font.Color := clLime;
    end
    else if (cod>=1)or(cod<=15) then begin
      sLabel72.Font.Color := clRed;
      sLabel73.Font.Color := clRed;
      sLabel74.Font.Color := clRed;
      sLabel75.Font.Color := clRed;
      sLabel76.Font.Color := clRed;
      sLabel77.Font.Color := clRed;
    end
    else begin
      sLabel72.Font.Color := clSilver;
      sLabel73.Font.Color := clSilver;
      sLabel74.Font.Color := clSilver;
      sLabel75.Font.Color := clSilver;
      sLabel76.Font.Color := clSilver;
      sLabel77.Font.Color := clSilver;
    end;
    //强制刷新标签
    sLabel72.Repaint;
    sLabel73.Repaint;
    sLabel74.Repaint;
    sLabel75.Repaint;
    sLabel76.Repaint;
    sLabel77.Repaint;
  end;
end;
//自动模式下,刷新设备故障码
function AutoFaultCode(cod:Integer):string;
var
  str : string;
begin
  //翻译cod
  case cod of
    -1:str := '通讯故障';
    0: str := '未知故障';
    1: str := '上阀门关故障';
    2: str := '下阀门关故障';
    3: str := '双阀门关故障';
    4: str := '上阀门开故障';
    5: str := '上阀门开关故障';
    6: str := '上阀门开、下阀门关故障';
    7: str := '上阀门开关、下阀门关故障';
    8: str := '下阀门开故障';
    9: str := '下阀门开、上阀门关故障';
    10: str := '下阀门开关故障';
    11: str := '下阀门开关、上阀门关故障';
    12: str := '双阀门开故障';
    13: str := '上阀门开关、下阀门开故障';
    14: str := '下阀门开关、上阀门开故障';
    15: str := '双阀门开关故障';
    16: str := '没有粮食在漏斗中';
    32: str := '抽屉没有放好';
    256:str := '故障重启';
    else str := '故障未定义';
  end;
  //输出到界面
  with frmMain do begin
    //更新自动模式界面
    sLabel74.Caption := Format('设备状态-[%s]',[str]);
    //修改样式
    sLabel74.Font.Color := clRed;
    sLabel74.Repaint;
  end;
  //返回故障字符串
  result := str;
end;
end.
src/init/uInit.~pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,529 @@
{------------------------------------------------------------------------------}
{单元名称:uInit.pas                                                           }
{模块名称:初始化函数库                                                        }
{模块说明:包括主进程启动时,全局变量初始化、系统目录初始化、配置加载          }
{建立日期:2009-12-20                                                          }
{修改修改:2023-02-21                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit uInit;
interface
uses
  Windows, Classes, Messages, Forms, Dialogs, SysUtils, StrUtils, DateUtils,
  StdCtrls, Variants, ComCtrls, Buttons, Math, IniFiles, Graphics, ShellAPI,
  SQLite3, SQLiteTable3;
  {申明全局公共调用函数}
  procedure OpenOnScreenKeyboard();
  procedure InitGlobal();
  procedure InitSystemDir();
  procedure InitDatas();
  procedure LoadSystemInfo();
  procedure LoadOptions();
  procedure SaveOptions();
  function GetCurrMsgPos(index:Integer):TPoint;
  //授权文件检查模块
  function GetMachineCode():String;
  function CheckLicense(sFilename, sCode:String):Boolean;
  procedure RegCheckMode();
  procedure RegCheck1Mode();
  //保存csv数据
  procedure WriteCsvFile(name: string; mois,temp,water: Double);
  //刷新故障码
  procedure RefashFaultCode(cod:Integer);
implementation
uses
  uMain, log4me, uDM, PubUtils, MsgVar, Global, uSaveData, CpuidInfo, UntDes;
  {函数方法}
//------- è°ƒç”¨ä¸‰æ–¹é”®ç›˜ ------------------------------------
//调用osk键盘
procedure OpenOnScreenKeyboard();
type TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
type TWow64RevertWow64FsRedirection = function(var Wow64RevertWow64FsRedirection: LongBool): LongBool; StdCall;
var
  hHandle: THandle;
  Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
  Wow64RevertWow64FsRedirection: TWow64RevertWow64FsRedirection;
  OldValue: LongBool;
  rs: Integer;
begin
  //切换32位文件系统
  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
    if ((hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then
      Wow64DisableWow64FsRedirection(OldValue);
  except
  end;
  //调用osk屏幕键盘
  rs := ShellExecute(Application.Handle, 'open', 'osk.exe', nil, nil, SW_SHOWNORMAL);
  if rs <= 32 then begin
    ShowMessage(Format('错误:无法打开屏幕键盘,错误代码-[%d].',[rs]));
    log4Info(Format('错误:无法打开屏幕键盘,错误代码-[%d].',[rs]));
  end
  else
    log4Info('系统:上位机软件打开 osk ç³»ç»Ÿå±å¹•键盘.');
  //用回64位文件系统
  try
    hHandle := GetModuleHandle('kernel32.dll');
    @Wow64RevertWow64FsRedirection := GetProcAddress(hHandle, 'Wow64RevertWow64FsRedirection');
    if ((hHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then
      Wow64RevertWow64FsRedirection(OldValue);
  except
  end;
end;
//---------------------------------------------------------------------------
//初始化全局变量
procedure InitGlobal();
begin
  //程序路径
  glAppPath := ExtractFilePath(Application.ExeName);
  //configDB file
  glConfig_db := glAppPath + CONFIG_DIR + t_Config + '.db';
  glConn_db   := glAppPath + CONFIG_DIR + t_Conn + '.db';
  glGrain_db  := glAppPath + CONFIG_DIR + t_Grain + '.db';
  glWeight_db := glAppPath + CONFIG_DIR + t_Weight + '.db';
  glManager_db := glAppPath + CONFIG_DIR + t_Manager + '.db';
  glData_db   := glAppPath + CONFIG_DIR + t_Data + '.db';
  //初始化Calc全局变量
  glCalcOutput := '';
  glCurrFocus  := 0;
  //初始化手动模式返回口令值
  frmMain.sLoginPwd := '';
  //初始化样本存储变量
  smp.flag := false;
  smp.info := '';
  smp.prefix := '';
  smp.dir := '';
end;
//初始化系统目录
procedure InitSystemDir();
var
  path : String;
begin
  //创建配置文件夹
  path := glAppPath + CONFIG_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
  //创建数据文件夹
  path := glAppPath + DATA_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
  //创建日志文件夹
  path := glAppPath + LOG_DIR;
  if not DirectoryExists(path) then ForceDirectories(path);
end;
//初始化数据采集结构
procedure InitDatas();
begin
  //初始化Datas测量数据
  Datas.Voltage := 0;   //原始电平
  Datas.Weight := 0;    //重量
  Datas.Temp := 0;      //温度
  Datas.Humid:= 0;      //湿度
  //初始化自动检测标签
  frmMain.lblAutoRet.Caption := '';
  frmMain.lblAutoRet_error.Caption := '';
end;
//加载系统信息界面
procedure LoadSystemInfo();
begin
  with frmMain do begin
    //初始化水分仪串口下拉菜单
    cbSerialPort.Items.Clear;
    EnumComPorts(cbSerialPort.Items);
    //加载水分仪参数
    cbSerialPort.Text := WrConn.SerialPort;
    edtBaud.Text := IntToStr(WrConn.baud);
    edtParity.Text := WrConn.parity;
    edtData_bit.Text := IntToStr(WrConn.data_bit);
    edtStop_bit.Text := IntToStr(WrConn.stop_bit);
    cbAutoRun.Checked := glAutoRun;
    //增加两个时间设置值
    edtTime1.Text := IntToStr(glTime1);
    edtTime2.Text := IntToStr(glTime2);
    //加载PLC参数
    edtIP.Text := PlcConn.ip;
    edtPort.Text := IntToStr(PlcConn.port);
    //加载手动检测和参数配置界面的数据存储参数
    cbTestAutoSave.Checked := smp.flag;
    edtSampleName.Text := smp.info;
    cbAutoSave.Checked := smp.flag;
    edtPrefix.Text := smp.prefix;
    edtDir.Text := smp.dir;
    //加载登录口令
    edtPassword.Text := SysConfig.password;
    edtDelay.Text := IntToStr(SysConfig.delay);
  end;
end;
//加载参数到界面
procedure LoadOptions();
begin
  with frmMain do begin
    //手动检测界面
    mtManClock.Value := 0;
    edtMoisture.Text := '';
    edtWeightRatio.Text := '';
    edtWeight.Text := '';
    edtTemp.Text := '';
    edtWater.Text := '';
    lbType.ItemIndex := Grain.Code-1; //粮种代码与界面ItemIndex的对应关系
    sLabel15.Caption := Format('粮食种类 - [%s]',[Grain.Name]);
    sLabel3.Caption := Format('选择 - [%s]',[Grain.Name]);
    //仪器校准界面
    lbType1.ItemIndex := Grain.Code-1;
    edtAutoCoef1.Text := Grain.coef[0];
    edtAutoCoef2.Text := Grain.coef[1];
    edtAutoCoef3.Text := Grain.coef[2];
    edtAutoCoef4.Text := Grain.coef[3];
    edtAutoCoef5.Text := Grain.coef[4];
    //参数设置界面
    edtVolume.Text := FloatToStr(SysConfig.Volume);
    edtTare.Text := FloatToStr(SysConfig.Tare);
    edtFreq.Text := FloatToStr(SysConfig.Freq);
    edtDecay.Text:= FloatToStr(SysConfig.Decay);
    edtStartFreq.Text := FloatToStr(SysConfig.StartFreq);
    edtStopFreq.Text := FloatToStr(SysConfig.StopFreq);
    edtStep.Text := IntToStr(SysConfig.Step);
    lbASK.ItemIndex := SysConfig.Ask;  //ASK代码与界面ItemIndex的对应关系
    //系统信息界面
    lblVersion.Caption := Format('版本 %s ', [glFileVersion]);
  end;
end;
//保存界面参数
procedure SaveOptions();
begin
  //
end;
//------ åŠŸèƒ½å‡½æ•° -------------------------------------------------------------
//获取当前焦点输入框的绝对坐标
function GetCurrMsgPos(index:Integer):TPoint;
var
  x1,y1 : Integer;  //修正值
  x3,x45,y2 : Integer;
begin
  with frmMain do begin
    x1 := edtMois1.Width + 5;
    y1 := edtMois1.Height - 40;
    x3 := edtMois1.Width - 8;
    x45 := -473;
    y2  := -250;
    case index of
      1:begin
        Result.X := Left+edtMois1.Left+x1;
        Result.Y := Top+edtMois1.Top+y1;
      end;
      2:begin
        Result.X := Left+edtMois2.Left+x1;
        Result.Y := Top+edtMois2.Top+y1;
      end;
      3:begin
        Result.X := Left+edtMois3.Left+x3;
        Result.Y := Top+edtMois3.Top+y1;
      end;
      4:begin
        Result.X := Left+edtMois4.Left+x45;
        Result.Y := Top+edtMois4.Top+y1;
      end;
      5:begin
        Result.X := Left+edtMois5.Left+x45;
        Result.Y := Top+edtMois5.Top+y1;
      end;
      6:begin
        Result.X := Left+edtManCoef1.Left+x1;
        Result.Y := Top+edtManCoef1.Top+y2;
      end;
      7:begin
        Result.X := Left+edtManCoef2.Left+x1;
        Result.Y := Top+edtManCoef2.Top+y2;
      end;
      8:begin
        Result.X := Left+edtManCoef3.Left+x3;
        Result.Y := Top+edtManCoef3.Top+y2;
      end;
      9:begin
        Result.X := Left+edtManCoef4.Left+x45;
        Result.Y := Top+edtManCoef4.Top+y2;
      end;
      10:begin
        Result.X := Left+edtManCoef5.Left+x45;
        Result.Y := Top+edtManCoef5.Top+y2;
      end;
      11:begin
        Result.X := Left+edtIp.Left+edtIp.Width+35;
        Result.Y := Top+edtIp.Top+edtIp.Height+70;
      end;
      12:begin
        Result.X := Left+edtPort.Left+edtPort.Width+30;
        Result.Y := Top+edtPort.Top+edtPort.Height+70;
      end;
      13:begin
        Result.X := Left+edtTime1.Left+edtTime1.Width+35;
        Result.Y := Top+edtTime1.Top+edtTime1.Height+190;
      end;
      14:begin
        Result.X := Left+edtTime2.Left+edtTime2.Width+35;
        Result.Y := Top+edtTime2.Top+edtTime2.Height+190;
      end;
      15:begin
        Result.X := Left+edtWeight1.Left+edtWeight1.Width+5;
        Result.Y := Top+edtWeight1.Top+edtWeight1.Height-50;
      end;
      16:begin
        Result.X := Left+edtWeight2.Left+edtWeight2.Width+5;
        Result.Y := Top+edtWeight2.Top+edtWeight2.Height-50;
      end;
      17:begin
        Result.X := Left+edtWeight3.Left-475;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-50;
      end;
      18:begin
        Result.X := Left+edtWeight3.Left-220;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-120;
      end;
      19:begin
        Result.X := Left+edtWeight3.Left-220;
        Result.Y := Top+edtWeight3.Top+edtWeight3.Height-20;
      end;
      20:begin
        Result.X := Left+edtVolume.Left+edtVolume.Width+5;
        Result.Y := Top+edtVolume.Top+edtVolume.Height-45;
      end;
      21:begin
        Result.X := Left+edtTare.Left+edtTare.Width+5;
        Result.Y := Top+edtTare.Top+edtTare.Height-45;
      end;
      22:begin
        Result.X := Left+edtDelay.Left+edtDelay.Width+35;
        Result.Y := Top+edtDelay.Top+edtDelay.Height+240;
      end;
      23:begin
        Result.X := Left+edtPassword.Left+edtPassword.Width+35;
        Result.Y := Top+edtPassword.Top+edtPassword.Height+225;
      end;
      24:begin
        Result.X := Left+edtManVal.Left+x1;
        Result.Y := Top+edtManVal.Top-40;
      end;
      25:begin
        Result.X := Left+edtIntercept.Left+x1;
        Result.Y := Top+edtIntercept.Top-80;
      end;
    end;
  end;
end;
//------- ç³»ç»ŸæŽˆæƒç›¸å…³å‡½æ•° -----------------------------------------------------
//计算本机机器码,输出机器码密文
function GetMachineCode():String;
var
  ss : string;
begin
  SetCPU(GetCurrentProcess,1);
  ss := GetCnCPUID();
  //生成一个机器码
  Result := EncryStrHex(ss, sConfig);
end;
//授权文件校验,返回校验结果
//入参:sfilename-校验文件
//      sCode-计算本机机器码
//返回:true-校验成功;false-校验失败
function CheckLicense(sFilename, sCode:String):Boolean;
var
  i : Integer;
  sDecry : String;  //解密后的明文
  sl : TStringList;
begin
  //容错处理
  if not FileExists(sFileName) then begin
    Result := false;
    Exit;
  end;
  //获取密文
  sl := TStringlist.Create();
  try
    sl.LoadFromFile(sFilename);
    sDecry := Trim(sl.Text);
  finally
    FreeAndNil(sl);
  end;
  //对密文信息进行解码,按默认level=8
  for i:=1 to 8 do
    sDecry := DecryStrHex(sDecry, sConfig); //编码,生成明文
  //获取RegCode+RegDate+RegLevel+RegType+RegKey æœºå™¨ç 
  sDESMachineCode := SplitStr(sDecry,' ',0);
  sDESDate := SplitStr(sDecry,' ',1);
  sDESLevel := SplitStr(sDecry,' ',2);
  sDESType := SplitStr(sDecry,' ',3);
  sDESKey := SplitStr(sDecry,' ',4);
  //返回比较机器码
  Result := AnsiSameStr(sCode, sDESMachineCode);
end;
//License授权检查模块,如未注册则自动退出
procedure RegCheckMode();
var
  sl : TStringList;
  sLicFile, sMchCod, sLicText : String;
begin
  //======验证授权文件===============================
  sLicFile := glAppPath + LICENSE_FILE;
  sMchCod := GetMachineCode();
  if CheckLicense(sLicFile, sMchCod) then
    glRegSuccess := true
  else begin
    //存注册码
    sl := TStringList.Create();
    sl.Add('机器码:' + sMchCod);
    sl.Add('生成日期:' + FormatDateTime('yyyy-mm-dd hh:nn:ss',Now()));
    sl.SaveToFile(glAppPath+'机器码.txt');
    FreeAndNil(sl);
    //提示要获取授权文件
    glRegSuccess := false;  //注册失败,调整标志,准备释放退出定时器
    sLicText := '警告:系统尚未注册,已在软件目录生成 [机器码] æ–‡ä»¶ï¼Œè¯·å°†è¯¥æ–‡ä»¶æä¾›ç»™ç³»ç»Ÿä¾›åº”商,以获取正式授权文件!';
    MessageBox(frmMain.handle,PChar(sLicText),'注册提示对话框',MB_OK+MB_ICONWARNING);
    //开启退出定时器, 0.5s内退出
    dm.tmRegFault.Enabled := true;
  end;
end;
//静默授权检查模块
procedure RegCheck1Mode();
var
  sLicFile, sMchCod : String;
begin
  sLicFile := glAppPath + LICENSE_FILE;
  sMchCod := GetMachineCode();
  if not CheckLicense(sLicFile, sMchCod) then
    dm.tmRegFault.Enabled := true;
end;
//------------------------------------------------------------------------------
function GetLastNum(const FileName: string): Integer;
var
  FileStream: TextFile;
  LastDataLine,Line,Fields: string;
begin
  Result := 0;
  // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦å­˜åœ¨
  if not FileExists(FileName) then Exit;
  // æ‰“开文件
  AssignFile(FileStream, FileName);
  try
    Reset(FileStream);
    // è·³è¿‡æ ‡é¢˜è¡Œ
    if not Eof(FileStream) then ReadLn(FileStream);
    // è¯»å–文件的每一行
    LastDataLine := '';
    while not Eof(FileStream) do begin
      ReadLn(FileStream, Line);
      if Line <> '' then
        LastDataLine := Trim(Line);
    end;
    // è§£æžæœ€åŽä¸€è¡Œ
    if LastDataLine <> '' then begin
      Fields := SplitStr(LastDataLine,',',0);
      Result := StrToIntDef(Fields,0);
    end;
  finally
    CloseFile(FileStream);
  end;
end;
// å°†æ£€æµ‹ç»“果保存到 csv文件
procedure WriteCsvFile(name: string; mois,temp,water: Double);
var
  pMyFile: textFile;
  sfile,sTitle,sMsg,time : string;
  no : integer;
begin
  //初始化路径和标题
  sFile := smp.dir + smp.prefix + FormatDateTime('yyyymmdd', Now) + '.csv';
  sTitle:= '序号,样本信息,含水率,温度,湿度,日期';
  //读取文件历史no序号
  no := GetLastNum(sFile)+1;
  time := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now);
  sMsg  := Format('%d,%s,%.2f,%.2f,%.2f,%s', [no,name,mois,temp,water,time]);
  try
    AssignFile(pMyFile,sFile);
    if FileExists(sFile) then
      Append(pMyFile)
    else begin
      ReWrite(pMyFile);
      WriteLn(pMyFile,sTitle); //新建csv,先写入标题
    end;
    WriteLn(pMyFile,sMsg);     //写入内容
  finally
    CloseFile(pMyFile);
  end;
end;
//刷新设备故障码
procedure RefashFaultCode(cod:Integer);
var
  str : string;
begin
  //翻译cod
  if cod=0 then str := '正常'
  else if cod=1 then str := '上阀门卡住'
  else if cod=2 then str := '下阀门卡住'
  else str := '未定义';
  //输出到界面
  with frmMain do begin
    sLabel72.Caption := Format('设备状态-[%s]',[str]);    //更新调整截距界面
    sLabel73.Caption := Format('设备状态-[%s]',[str]);    //更新手动检测界面
    sLabel74.Caption := Format('设备状态-[%s]',[str]);    //更新自动模式界面
    sLabel75.Caption := Format('设备状态-[%s]',[str]);    //更新手动校准界面
    sLabel76.Caption := Format('设备状态-[%s]',[str]);    //更新手动模式界面
  end;
  //修改样式
  with frmMain do begin
    if cod=0 then begin
      sLabel72.Font.Color := clLime;
      sLabel73.Font.Color := clLime;
      sLabel74.Font.Color := clLime;
      sLabel75.Font.Color := clLime;
      sLabel76.Font.Color := clLime;
    end
    else if (cod=1)or(cod=2) begin
      sLabel72.Font.Color := clRed;
      sLabel73.Font.Color := clRed;
      sLabel74.Font.Color := clRed;
      sLabel75.Font.Color := clRed;
      sLabel76.Font.Color := clRed;
    end
    else begin
      sLabel72.Font.Color := clSilver;
      sLabel73.Font.Color := clSilver;
      sLabel74.Font.Color := clSilver;
      sLabel75.Font.Color := clSilver;
      sLabel76.Font.Color := clSilver;
    end;
  end;
end;
end.
src/lib/ActuatorLib.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,229 @@
{------------------------------------------------------------------------------}
{项目名称:actuatorlib动态库                                                   }
{单元名称:actuatorlib.pas                                                     }
{版本版次:3.2.1                                                               }
{功能描述:基于粮食水分仪Actuator驱动封装的 Dll接口通讯库                      }
{建立日期:2023-10-27                                                          }
{修改修改:2025-01-20                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit ActuatorLib;
interface
//静态声明 lib库
const
  actuator_dll = 'core\Actuator.dll'; {自定义库}
//扦捡系统指令代码
const
  PLC_READY_GRAIN = $01;        //粮种准备命令代码(粮种已修改)
  PLC_READY_FINISH = $02;       //返回准备完成
  PLC_DETECT_START = $03;       //检测启动命令
  PLC_DETECT_FINISH = $04;      //返回检测完毕
  PLC_DEVICE_WR_RESET = $FE;    //设备水分仪复位命令
  PLC_DEVICE_WR_FAULT = $FF;    //返回水分仪故障代码
//WR水分仪指令代码
const
  WR_READY = $01;               //水分仪准备指令
  WR_DETECT = $02;              //水分仪检测指令
  WR_VERIFY = $03;              //水分仪校验指令
  WR_RESET = $04;               //水分仪复位指令
  WR_GOODS = $05;               //粮种变更指令
  WR_VALV01 = $07;              //上阀门开
  WR_VALV02 = $08;              //上阀门关
  WR_VALV03 = $09;              //下阀门开
  WR_VALV04 = $0A;              //下阀门关
  WR_VALV05 = $0B;              //双阀门开
  WR_VALV06 = $0C;              //双阀门关
  WR_VIBRATE_01 = $0D;          //振动开
  WR_VIBRATE_02 = $0E;          //振动关
////////////////////////////////////////////////////////////////////////////////
type
  {定义回调函数类型}
  //数据回调函数
  //typedef void(__stdcall* MESSAGE_HANDLER)(unsigned short *data, int nsize);
  TMessageCallBack = procedure(Data: PWord; Size: Integer); stdcall;
  //打开服务端
  //int __stdcall StartTcpSlave(int nSlavePort, const char* szDevPort, int baud,
  //                            char parity, int data_bit, int stop_bit, int detectTimeout = 60,
  //                            int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
  function StartTcpSlave(nSlavePort: Integer;
                         szSerialPort: PChar; baud: Integer;
                         parity: Char; data_bit: Integer; stop_bit: Integer;
                         detectTimeout: Integer; resetTimeout: Integer;
                         handler: TMessageCallBack): Integer; stdcall; external actuator_dll;
  //ACTUATOR_API int __stdcall StartTcpSlave(void* waterDev, int nSlavePort,
  //                                        int detectTimeout = 60, int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
  function StartTcpSlaveEx(waterDev:Pointer; nSlavePort: Integer;
                         detectTimeout: Integer=60; resetTimeout: Integer=10;
                         handler: TMessageCallBack=nil ): Integer; stdcall; external actuator_dll;
  //关闭服务端
  //int __stdcall StopTcpSlave();
  function StopTcpSlave: Integer; stdcall; external actuator_dll;
////////////////////////////////////////////////////////////////////////////////
  {定义 Dll函数调用申明}
  //创建初始化客户PLC设备句柄ctx
  //strIp:   IP地址
  //nPort:   ç½‘络端口
  //ACTUATOR_API void* CreatePlcDevice(const char* strIp, int nPort);
  function CreatePlcDevice(strIp:PChar; nPort:Integer):Pointer; stdcall; external actuator_dll;
  //创建水分仪句柄ctx
  //szSerialPort:   ä¸²å£å
  //baud:       æ³¢ç‰¹çއ
  //parity:     æ ¡éªŒç±»åž‹
  //data_bit:   æ•°æ®ä½
  //stop_bit:   Í£Ö¹Î»
  //ACTUATOR_API void* CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
  function CreateWrDevice(szSerialPort:PChar; baud:Integer; parity:Char; data_bit:Integer; stop_bit:Integer):Pointer; stdcall; external actuator_dll;
  //连接客户设备或水分仪装置
  //ctxDev : è®¾å¤‡å¥æŸ„
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ConnectDevice(void* ctxDev);
  function ConnectDevice(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //获取状态或粮种更改信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
  //         0x01:  ç²®ç§å·²ä¿®æ”¹
  //         0x03:  å¼€å§‹æµ‹è¯•
  //         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
  //         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
  //nGoodType: ç²®ç§ç¼–号
  //         0x01:  å°éº¦,
  //         0x02:  æ°´ç¨»
  //         0x03:  é»„豆
  //         0x04:  çŽ‰ç±³
  //返回值:从入参返回 çŠ¶æ€å­—ã€ç²®ç§ç¼–å·ã€æ‰§è¡Œç»“æžœ(小于0--错误)
  //ACTUATOR_API int ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
  function ReadState(ctxDev:Pointer; nState:PWord; nGrainType:PWord):Integer; stdcall; external actuator_dll;
  //写回状态
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
  //         0x02:  å‡†å¤‡å·²å®Œæˆ
  //         0x04:  æ£€æµ‹å®Œæˆ
  //         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int WriteState(void* ctxDev, unsigned short nState);
  function ResponseState(ctxDev:Pointer; nState:Word):Integer; stdcall; external actuator_dll;
  //回传检测数据
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nDatas ï¼šæ•°ç»„,数据顺序如下
  //         ç²®ç§ç¼–码
  //         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
  //         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
  //nSize  : æ•°æ®ä¸ªæ•°
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
  function UploadData(ctxDev:Pointer; nDatas:PWord; nSize:Word=3):Integer; stdcall; external actuator_dll;
  //下发命令信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nCmdType ï¼šå‘½ä»¤å­—,如下描述
  //         0x01:  ç²®ç§å·²ä¿®æ”¹
  //         0x02:  å¼€å§‹æµ‹è¯•
  //         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
  //nGoodType: ç²®ç§ç¼–号
  //         0x01:  å°éº¦,
  //         0x02:  æ°´ç¨»
  //         0x03:  é»„豆
  //         0x04:  çŽ‰ç±³
  //         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
  // nResponseSeconds: å“åº”时间,以秒计算
  // nResponseUSeconds: å“åº”时间,以微妙计算,若小于秒,全部用微妙表示。
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
  function SendCommands(ctxDev:Pointer; nCmdType:Word; nGrainType:Word=0; nResponseSeconds:Integer=20; nResponseUSeconds:Integer=0):Integer; stdcall; external actuator_dll;
  //复位命令
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:无,
  //ACTUATOR_API int __stdcall ResetCommand(void* ctxDev);
  function ResetCommand(ctxDev:Pointer):Integer;stdcall; external actuator_dll;
  //下发参数
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nStartFreq ï¼šèµ·å§‹é¢‘率
  //nStopFreq ï¼š ç»ˆæ­¢é¢‘率
  //nStepFreq ï¼š æ­¥é•¿
  //nDecayCode ï¼šè¡°å‡ç 
  //nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
  //                          unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
  function WriteParams(ctxDev:Pointer; nStartFreq,nStopFreq,nStepFreq,nDecayCode,nAscValid:Word):Integer; stdcall; external actuator_dll;
  //读取检测信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nDatas ï¼šæ•°ç»„,数据顺序如下
  //         ç”µåދ值
  //         é‡é‡ /100
  //         æ¸©åº¦ /100
  //         æ¹¿åº¦ /100
  // nSize : è¯»å–4个寄存器
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
  function ReadDatas(ctxDev:Pointer; nDatas:PWord; nSize:Word=4):Integer; stdcall; external actuator_dll;
  //读取扫频值,其实为电平值,
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nVcc   ï¼šç”µå¹³å€¼æŒ‡é’ˆ
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ReadVcc(void* ctxDev, unsigned short* nVcc);
  function ReadVcc(ctxDev:Pointer; nVcc:PWord):Integer; stdcall; external actuator_dll;
  function ReadWeight(ctxDev:Pointer; nWg:PWord):Integer; stdcall; external actuator_dll;
  function CalcValue(nDValue:Word; Coef0,Coef1,Coef2,Coef3,Coef4:double):double; stdcall; external actuator_dll;
  //销毁水分仪或PLC设备
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int DestroyDevice(void* ctxDev);
  function DestroyDevice(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //断开水分仪或PLC设备连接
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int __stdcall Disconnect(void* ctxDev)
  function Disconnect(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //算法函数
  //x ä¸ºæµ‹é‡å€¼
  //y ä¸ºå®žé™…值
  //n ä¸ºæ‹Ÿåˆæ¬¡æ•°
  //nSampleNumber æ ·æœ¬æ•°é‡
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
  function Linearize(x,y:PSingle; Coefficient:PDouble; n:integer=2; nSampleNumber:integer=5):Integer; stdcall; external actuator_dll;
  //ACTUATOR_API int __stdcall PolyNomialFit(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
  function PolyNomialFit(x,y:PDouble; Coefficient:PDouble; n:integer=2; nSampleNumber:integer=5):Integer; stdcall; external actuator_dll;
  //读固件版本号
  function ReadVersion(ctxDev:Pointer; Version:PWord; nSize:Word=2):Integer; stdcall; external actuator_dll;
  //读取故障码,
  //ctxDev :设备句柄
  //nFaultCode :故障码
  //0-正常
  //1-上阀门卡住
  //2-下阀门卡住
  //3-(未定义)以此类推
  //返回值:小于0 è¡¨ç¤º é”™è¯¯
  //ACTUATOR API int stdcall ReadFaultCode(void* ctxDev, unsigned short* nFaultCode);
  function ReadFaultCode(ctxDev:Pointer; nFaultCode:PWord):Integer; stdcall; external actuator_dll;
implementation
end.
src/lib/ActuatorLib.~pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
{------------------------------------------------------------------------------}
{项目名称:actuatorlib动态库                                                   }
{单元名称:actuatorlib.pas                                                     }
{版本版次:3.2.1                                                               }
{功能描述:基于粮食水分仪Actuator驱动封装的 Dll接口通讯库                      }
{建立日期:2023-10-27                                                          }
{修改修改:2025-01-20                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit ActuatorLib;
interface
//静态声明 lib库
const
  actuator_dll = 'core\Actuator.dll'; {自定义库}
//PLC指令代码
const
  PLC_READY_GRAIN = $01;        //粮种准备命令代码(粮种已修改)
  PLC_READY_FINISH = $02;       //返回准备完成
  PLC_DETECT_START = $03;       //检测启动命令
  PLC_DETECT_FINISH = $04;      //返回检测完毕
  PLC_DEVICE_WR_RESET = $FE;    //设备水分仪复位命令
  PLC_DEVICE_WR_FAULT = $FF;    //返回水分仪故障代码
//WR水分仪指令代码
const
  WR_READY = $01;               //水分仪准备指令
  WR_DETECT = $02;              //水分仪检测指令
  WR_VERIFY = $03;              //水分仪校验指令
  WR_RESET = $04;               //水分仪复位指令
  WR_GOODS = $05;               //粮种变更指令
  WR_VALV01 = $07;              //上阀门开
  WR_VALV02 = $08;              //上阀门关
  WR_VALV03 = $09;              //下阀门开
  WR_VALV04 = $0A;              //下阀门关
  WR_VALV05 = $0B;              //双阀门开
  WR_VALV06 = $0C;              //双阀门关
  WR_VIBRATE_01 = $0D;          //振动开
  WR_VIBRATE_02 = $0E;          //振动关
  {定义 Dll函数调用申明}
  //创建初始化客户PLC设备句柄ctx
  //strIp:   IP地址
  //nPort:   ç½‘络端口
  //ACTUATOR_API void* CreatePlcDevice(const char* strIp, int nPort);
  function CreatePlcDevice(strIp:PChar; nPort:Integer):Pointer; stdcall; external actuator_dll;
  //创建水分仪句柄ctx
  //szSerialPort:   ä¸²å£å
  //baud:       æ³¢ç‰¹çއ
  //parity:     æ ¡éªŒç±»åž‹
  //data_bit:   æ•°æ®ä½
  //stop_bit:   Í£Ö¹Î»
  //ACTUATOR_API void* CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
  function CreateWrDevice(szSerialPort:PChar; baud:Integer; parity:Char; data_bit:Integer; stop_bit:Integer):Pointer; stdcall; external actuator_dll;
  //连接客户设备或水分仪装置
  //ctxDev : è®¾å¤‡å¥æŸ„
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ConnectDevice(void* ctxDev);
  function ConnectDevice(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //获取状态或粮种更改信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
  //         0x01:  ç²®ç§å·²ä¿®æ”¹
  //         0x03:  å¼€å§‹æµ‹è¯•
  //         0xFE:  å¤ä½å‘½ä»¤ï¼Œä¼˜å…ˆçº§æœ€é«˜
  //         å…¶ä»–: ä¸ºå†™å…¥çŠ¶æ€
  //nGoodType: ç²®ç§ç¼–号
  //         0x01:  å°éº¦,
  //         0x02:  æ°´ç¨»
  //         0x03:  é»„豆
  //         0x04:  çŽ‰ç±³
  //返回值:从入参返回 çŠ¶æ€å­—ã€ç²®ç§ç¼–å·ã€æ‰§è¡Œç»“æžœ(小于0--错误)
  //ACTUATOR_API int ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
  function ReadState(ctxDev:Pointer; nState:PWord; nGrainType:PWord):Integer; stdcall; external actuator_dll;
  //写回状态
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nState ï¼šçŠ¶æ€å­—ï¼Œå¦‚ä¸‹çŠ¶æ€ä¸ä¼šé‡å¤
  //         0x02:  å‡†å¤‡å·²å®Œæˆ
  //         0x04:  æ£€æµ‹å®Œæˆ
  //         0xFF:  æ°´åˆ†ä»ªæ•…éšœ
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int WriteState(void* ctxDev, unsigned short nState);
  function ResponseState(ctxDev:Pointer; nState:Word):Integer; stdcall; external actuator_dll;
  //回传检测数据
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nDatas ï¼šæ•°ç»„,数据顺序如下
  //         ç²®ç§ç¼–码
  //         å«æ°´çŽ‡ï¼Œ  å–æ•´ = åŽŸå€¼*100
  //         å®¹é‡æ¯”,  å–æ•´ = åŽŸå€¼*100
  //nSize  : æ•°æ®ä¸ªæ•°
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
  function UploadData(ctxDev:Pointer; nDatas:PWord; nSize:Word=3):Integer; stdcall; external actuator_dll;
  //下发命令信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nCmdType ï¼šå‘½ä»¤å­—,如下描述
  //         0x01:  ç²®ç§å·²ä¿®æ”¹
  //         0x02:  å¼€å§‹æµ‹è¯•
  //         0x03:  æ ¡å‡†å‘½ä»¤ï¼Œå³ä¸ºæ ‡å®šé¡µé¢æ£€æµ‹æŒ‰é’®å‘½ä»¤ï¼Œ
  //nGoodType: ç²®ç§ç¼–号
  //         0x01:  å°éº¦,
  //         0x02:  æ°´ç¨»
  //         0x03:  é»„豆
  //         0x04:  çŽ‰ç±³
  //         å½“nCmdType ä¸º0x02,0x03时,不用考虑粮种编号
  // nResponseSeconds: å“åº”时间,以秒计算
  // nResponseUSeconds: å“åº”时间,以微妙计算,若小于秒,全部用微妙表示。
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
  function SendCommands(ctxDev:Pointer; nCmdType:Word; nGrainType:Word=0; nResponseSeconds:Integer=20; nResponseUSeconds:Integer=0):Integer; stdcall; external actuator_dll;
  //复位命令
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:无,
  //ACTUATOR_API int __stdcall ResetCommand(void* ctxDev);
  function ResetCommand(ctxDev:Pointer):Integer;stdcall; external actuator_dll;
  //下发参数
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nStartFreq ï¼šèµ·å§‹é¢‘率
  //nStopFreq ï¼š ç»ˆæ­¢é¢‘率
  //nStepFreq ï¼š æ­¥é•¿
  //nDecayCode ï¼šè¡°å‡ç 
  //nAscValid ï¼š ASC å†…部/外部有效, å–值为 0:内部有效, 1:外部有效
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
  //                          unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
  function WriteParams(ctxDev:Pointer; nStartFreq,nStopFreq,nStepFreq,nDecayCode,nAscValid:Word):Integer; stdcall; external actuator_dll;
  //读取检测信息
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nDatas ï¼šæ•°ç»„,数据顺序如下
  //         ç”µåދ值
  //         é‡é‡ /100
  //         æ¸©åº¦ /100
  //         æ¹¿åº¦ /100
  // nSize : è¯»å–4个寄存器
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
  function ReadDatas(ctxDev:Pointer; nDatas:PWord; nSize:Word=4):Integer; stdcall; external actuator_dll;
  //读取扫频值,其实为电平值,
  //ctxDev : è®¾å¤‡å¥æŸ„
  //nVcc   ï¼šç”µå¹³å€¼æŒ‡é’ˆ
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int ReadVcc(void* ctxDev, unsigned short* nVcc);
  function ReadVcc(ctxDev:Pointer; nVcc:PWord):Integer; stdcall; external actuator_dll;
  function ReadWeight(ctxDev:Pointer; nWg:PWord):Integer; stdcall; external actuator_dll;
  function CalcValue(nDValue:Word; Coef0,Coef1,Coef2,Coef3,Coef4:double):double; stdcall; external actuator_dll;
  //销毁水分仪或PLC设备
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int DestroyDevice(void* ctxDev);
  function DestroyDevice(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //断开水分仪或PLC设备连接
  //ctxDev : è®¾å¤‡å¥æŸ„指针
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int __stdcall Disconnect(void* ctxDev)
  function Disconnect(ctxDev:Pointer):Integer; stdcall; external actuator_dll;
  //算法函数
  //x ä¸ºæµ‹é‡å€¼
  //y ä¸ºå®žé™…值
  //n ä¸ºæ‹Ÿåˆæ¬¡æ•°
  //nSampleNumber æ ·æœ¬æ•°é‡
  //返回值:小于0 è¡¨ç¤º é”™è¯¯ï¼Œ
  //ACTUATOR_API int Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
  function Linearize(x,y:PSingle; Coefficient:PDouble; n:integer=2; nSampleNumber:integer=5):Integer; stdcall; external actuator_dll;
  //ACTUATOR_API int __stdcall PolyNomialFit(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
  function PolyNomialFit(x,y:PDouble; Coefficient:PDouble; n:integer=2; nSampleNumber:integer=5):Integer; stdcall; external actuator_dll;
  //读固件版本号
  function ReadVersion(ctxDev:Pointer; Version:PWord; nSize:Word=2):Integer; stdcall; external actuator_dll;
implementation
end.
src/log/log4me.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,231 @@
{------------------------------------------------------------------------------}
{项目名称:日志单元                                                            }
{单元名称:log4me.pas                                                          }
{版本版次:1.3                                                                }
{模块名称:公共函数库                                                          }
{功能描述:输出error、info、debug、data å››ä¸ªçº§åˆ«çš„æ—¥å¿—                         }
{建立日期:2011-01-01                                                          }
{版权所有:李良庭                                                              }
{------------------------------------------------------------------------------}
{修改日志
2019-02-28 è°ƒæ•´æŒ‰æ¯å°æ—¶ç”Ÿæˆæ—¥å¿—文件,支持日志载入和管理。
调用方法
procedure  log4error(msg: AnsiString); //写ERROR级别的日志
procedure  log4info(msg: AnsiString); //写INFO级别的日志
procedure  log4debug(msg: AnsiString); //写DEBUG级别的日志
function  log4filename():AnsiString; //得到当前日志文件全名
 é…ç½®æ–‡ä»¶ log4me.ini
#配置文件和主程序在同一目录.没有这个文件或不在主目录中则不写日志
[log4me]
#path,日志的存放目录.必须是主程序目录及子目录.
#例子:主程序目录
#path=.
#例子:子目录
#path=temp\logs
path=logs
#level,日志等级,只能是 error,info,debug之一
#为error时,只有log4error打印的日志被输出.
#为info时,log4error和log4info打印的日志被输出.
#为debug时,log4error,log4info,log4debug打印的日志都被输出.
level=info
}
unit log4me;
interface
uses classes, sysutils, ComObj, windows,IniFiles;
procedure  log4error(msg: AnsiString); //写ERROR级别的日志
procedure  log4info(msg: AnsiString);  //写INFO çº§åˆ«çš„æ—¥å¿—
procedure  log4debug(msg: AnsiString); //写DEBUG级别的日志
procedure  log4data(msg, sfile: AnsiString);//写原始数据日志
function  log4filename():AnsiString; //得到当前日志文件全名
var
  log_filename: AnsiString; //日志文件全名
implementation
var
  log_ThreadLock: TRTLCriticalSection; // ä¸´ç•ŒåŒº
  log_fileStream: TFileStream;
  log_filepath: AnsiString; //日志文件路径
  log_initime:TDateTime;
  log_doerror, log_dodebug, log_doinfo: Boolean;
procedure log_init();
var
 tmpStr:String;
begin
  log_doerror := False;
  log_dodebug := False;
  log_doinfo := False;
  if FileExists(ExtractFilePath(ParamStr(0)) + 'config\log4me.ini') then
  begin
    with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config\log4me.ini') do
      try
        log_filepath := ExtractFilePath(ParamStr(0)) + '\' + ReadString('log4me','path','logs') + '\';
        tmpStr := LowerCase(ReadString('log4me','level','info'));
        log_doerror :=  (tmpStr = 'debug') or (tmpStr = 'info') or (tmpStr = 'error');
        log_doinfo  :=  (tmpStr = 'debug') or (tmpStr = 'info');
        log_dodebug :=  (tmpStr = 'debug') ;
      finally
        Free;
      end;
  end;
  log_initime := Now;
end;
procedure log4me_addLog(filename: AnsiString; p: PAnsiChar);
var
 fmode :Word;
 tmp:AnsiString;
begin
  //进入临界区,多线程时可以保护资源
  EnterCriticalSection(log_ThreadLock);
  try
      try
        //如果要写的日志文件和打开的不同(在程序第一次运行和跨天的时候出现)
        //则关闭打开的日志文件。
        if filename <> log_filename then
        begin
          log_filename := filename;
          if Assigned(log_fileStream) then
          begin
            log_fileStream.Free;
            log_fileStream := nil;
          end;
        end;
        //如果要写的日志文件没有打开(在程序第一次运行和跨天的时候出现)
        //则打开日志文件。
        if not Assigned(log_fileStream) then
        begin
           if FileExists(log_filename) then
             fmode := fmOpenWrite or fmShareDenyNone
           else
             fmode := fmCreate or fmShareDenyNone ;
          log_fileStream := TFileStream.Create(log_filename,fmode);
          log_fileStream.Position := log_fileStream.Size;
        end;
        //在日志文件中写入日志
        log_fileStream.Write(p^, strlen(p));
      except
        on E:Exception do
        begin
            try
              tmp := ExtractFilePath(ParamStr(0)) + 'log\log4me_err.log';
              if FileExists(tmp) then
                 fmode := fmOpenWrite or fmShareDenyNone
              else
                 fmode := fmCreate or fmShareDenyNone ;
              with TFileStream.Create(tmp, fmode) do
              begin
                Position := Size;
                tmp := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' ' +  E.Message +  #13#10;
                Write(tmp[1],Length(tmp));
                Free;
              end;
            except
            end;
        end;
      end;
  finally
    //无论如何,离开临界区
    LeaveCriticalSection(log_ThreadLock);
  end;
end;
procedure log4write(msg: AnsiString);
var
  strline: AnsiString;
begin
   // æœ€å¤šæ¯ç§’重加载一次配置文件
   if (Now() - log_initime) > (1/(24*60*60)) then
     log_init();
   //日志开头加时间
   strline := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' ' + msg + #13#10;
   //写到当天的日志文件中
   log4me_addLog(log_filepath + FormatDateTime('yyyymmdd', Now) + '.log', PAnsiChar(strline));
end;
//-----下面4个是对外方法-------------------------
function  log4filename():AnsiString;
begin
  Result := log_filename;
end;
procedure log4error(msg: AnsiString);
begin
  if log_doerror then
     log4write('[error]' + msg);
end;
procedure log4info(msg: AnsiString);
begin
  if log_doinfo then
    log4write('[info ]' + msg);
end;
procedure log4debug(msg: AnsiString);
begin
  if log_dodebug then
    log4write('[debug]' + msg);
end;
procedure log4data(msg, sfile: AnsiString);  //写原始数据日志
begin
  //最多每秒重加载一次配置文件
  if (Now() - log_initime) > (1/(24*60*60)) then
    log_init();
  //判断00字符串,增加回车换行
  msg := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' [data]' + #13#10 + msg + #13#10#13#10;
  //写到当天的日志文件中
  log4me_addLog(sfile, PAnsiChar(msg));
end;
// ----------- ç±»åˆå§‹åŒ– -------------//
initialization
  InitializeCriticalSection(log_ThreadLock);
  log_init;
  log4info('log4me: æ—¥å¿—系统启动.');
// ----------- ç±»é”€æ¯ -------------//
finalization
log4info('log4me: æ—¥å¿—系统停止.');
DeleteCriticalSection(log_ThreadLock);
if Assigned(log_fileStream) then
  log_fileStream.Free;
end.
src/pub/CpuidInfo.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
{------------------------------------------------------------------------------}
{项目名称:获取多CPUID信息                                                     }
{单元名称:CpuidInfo.pas                                                       }
{版本版次:1.0                                                                 }
{模块名称:全局公共函数库                                                      }
{功能描述:获取多CPUID息(支持多核)                                             }
{建立日期:2023-09-19                                                          }
{版权所有:李良庭                                                              }
{------------------------------------------------------------------------------}
unit CpuidInfo;
interface
uses
    Windows, SysUtils, StrUtils, Classes;
  function GetCPUID(): string;
  function GetCnCPUID(): string;
  procedure SetCPU(h: THandle;CpuNo: Integer);
  function CmdGetCPUID(): string;
  function CmdGetHDDID(): string;
implementation
//方法一:获取CPUID
function GetCPUID(): string;
const
  CPUINFO = 'CPU制造商: %S序列号: %X';
var
  s: array[0.. 19] of Char;
  MyCpuID: Integer;
begin
  FillChar(s, 20, 0);
  asm
    push ebx
    push ecx
    push edx
    mov eax, 0
    cpuid
    mov dword ptr s[0],ebx
    mov dword ptr s[4],edx
    mov dword ptr s[8],ecx
    mov eax, 1
    cpuid
    mov MyCpuID, edx
    pop edx
    pop ecx
    pop ebx
  end;
  Result := Format(CPUINFO, [s, MyCpuID]);
end;
//方法二:获取cpu的序列号
function GetCnCPUID(): string;
const
  //CPUINFO= '%.8x-%.8x-%.8x-%.8x';
  CPUINFO= '%.8x%.8x';
var
  iEax: Integer;
  iEbx: Integer;
  iEcx: Integer;
  iEdx: Integer;
begin
  asm
    push ebx
    push ecx
    push edx
    mov eax, 1
    DW $A20F    //cpuid
    mov iEax, eax
    mov iEbx, ebx
    mov iEcx, ecx
    mov iEdx, edx
    pop edx
    pop ecx
    pop ebx
  end;
  //Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
  Result := Format(CPUINFO, [iEdx,iEax]);
end;
//根据Windows可以设置进程和线程的亲缘性的特点,
//使用SetProcessAffinityMask函数来控制哪个cpu
//运行获取序列号的进程因此也就获取了指定的cpu
//的序列号。
//为了和单cpu兼容,建议总是获取第-个cpu的序例号。
procedure SetCPU(h: THandle; CpuNo: Integer);
//CpuNo:决定了获得第几个cpu内核的第几个序列号
var
  ProcessAffinity: Cardinal;
  _SystemAffinity: Cardinal;
begin
  GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;
  ProcessAffinity := CpuNo; //this sets the process to only run on CPU 0
                            //for CPU1 only use 2 and for CPUs1&2use3
  SetProcessAffinityMask(h, ProcessAffinity);
end;
//CMD命令获取CPUID的方法
//wmic cpu get processorid
function CmdGetCPUID(): string;
var
  files : TStringList;
begin
  //CMD命令获取mac信息
  winexec('cmd /c wmic cpu get processorid >d:\cpuid.txt', SW_HIDE);
  files:= TStringList.Create;
  sleep(500);
  try
    try
      files.LoadFromFile('d:\cpuid.txt');
      Result := files.Strings[1];
    except
      Result := '0000000000000000';
    end;
  finally
    FreeAndNil(files);
    winexec('cmd /c del d:\cpuid.txt', SW_HIDE);
  end;
end;
//CMD命令获取HDDID的方法
//wmic diskdrive get serialnumber
function CmdGetHDDID(): string;
var
  sl : TStringList;
begin
  //CMD命令获取mac信息
  winexec('cmd /c wmic diskdrive get serialnumber >d:\a.txt', SW_HIDE);
  sl:= TStringList.Create;
  sleep(500);
  try
    try
      sl.LoadFromFile('d:\a.txt');
      Result := sl.Strings[0];
    except
      Result := '0000000000000000';
    end;
  finally
    FreeAndNil(sl);
    winexec('cmd /c del d:\a.txt', SW_HIDE);
  end;
end;
end.
src/pub/Global.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,230 @@
{------------------------------------------------------------------------------}
{单元名称:Global.pas                                                          }
{模块名称:全局公共变量集                                                      }
{模块说明:包括全局变量、全局宏定义、参数数据结构等                            }
{建立日期:2009-12-20                                                          }
{修改修改:2025-07-03                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
//2024-10-14 å¢žåŠ gmmdata数据库,用来存储自动检测和手动检测的所有数据。
//2025-07-03 å¢žåŠ 1024X768、1024X600分辨率自适应功能。
unit Global;
interface
uses
  Windows;
  {定义全局常量}
const
  NOTE = '警告:本计算机程序受著作权法和计算机软件保护条例保护,未经授权擅'
        +'自复制或传播本程序的部分或全部,可能受到严厉的民事及刑事制裁,并'
        +'将在法律许可的范围内受到最大可能的起诉。';
  CONFIG_DIR = 'config\';                             {配置文件夹}
  DATA_DIR = 'data\';                                 {数据文件夹}
  LOG_DIR = 'log\';                                   {日志文件夹}
  LOG_FILE = 'log4me.ini';                            {日志配置文件}
  LICENSE_FILE = 'License.lic';                       {授权文件}
  sConfig = 'Config.db';                              {配置文件}
  //config配置全局变量
  t_Config = 'config';                                {配置数据库-仪器参数}
  t_Conn   = 'conn';                                  {配置数据库-通讯参数}
  t_Grain  = 'grain';                                 {配置数据库-粮种参数}
  //t_Test   = 'test';                                {检测数据库-检测结果}
  t_Data   = 'data';                                  {检测数据库-自动和手动检测结果}
  t_Weight = 'weight';                                {重量校准数据库}
  t_Manager = 'manager';                              {登录口令数据库}
  //枚举运行模式
type RunMode = (rmAuto, rmManual);                    //自动模式=0,手动模式=1
//扦捡系统配置参数
type
  TPlcRec = Record
    ip        : string;     //IP地址
    port      : integer;    //网络端口
    heart_ip   : string;     //心跳ip
    heart_port : Integer;    //心跳端口
end;
//WR配置参数
type
  TWrRec = Record
    SerialPort  : string;
    baud        : integer;
    parity      : char;
    data_bit    : integer;
    stop_bit    : integer;
end;
//config参数
type
  TConfigRec = Record
    Volume      : double;   //体积
    Tare        : double;   //皮重
    Freq        : double;   //频率码
    Decay       : double;   //衰减码
    Ask         : integer;  //ASK选择
    StartFreq   : double;   //起始频率
    StopFreq    : double;   //终止频率
    Step        : Integer;  //步长
    delay       : Integer;  //开机延迟时间s
    password    : string;   //手动模式登录口令
end;
//粮种信息参数
type
  TGrainRec = Record
    Code        : Integer;  //一级代码
    No          : string;   //编码
    Name        : string;   //名称
    Coef        : array [0..4] of string; //校准系数
    Intercept   : string;   //截距
    flag        : boolean;  //是否大类
end;
//采集数据格式
type
  TDacRec = Record
    Voltage     : double;   //电压
    Weight      : double;   //重量
    Temp        : double;   //温度
    Humid       : double;   //湿度
end;
//重量校准格式
type
  TWeighgRec = Record
    //系数
    k           : double;  //y=kx+b
    b           : double;
    tare        : double;  //ȥƤ
    range       : double;  //±误差范围
    //У׼
    test1       : double;
    test2       : double;
    test3       : double;
    std1        : double;
    std2        : double;
    std3        : double;
end;
//测试样本存储结构
type
  TSampleRec = Record
    flag        : boolean;   //自动保存标志
    info        : string;    //样本信息
    prefix      : string;    //文件名前缀
    dir         : string;    //存储目录
end;
  {定义全局变量}
//------------------------------------------------------------------------------
var
  CompanyName:String;                                 {公司名称}
  FileDescription:String;                             {说明}
  FileVersion:String;                                 {文件版本}
  InternalName:String;                                {内部名称}
  LegalCopyright:String;                              {版权}
  LegalTrademarks:String;                             {合法商标}
  OriginalFilename:String;                            {源文件名}
  ProductName:String;                                 {产品名称}
  ProductVersion:String;                              {产品版本}
  Comments:String;                                    {备注}
  //版本信息专用数组
  glVerInfo:array[1..9] of string=('ProductName',     //产品名称
                                   'ProductVersion',  //产品版本
                                   'FileDescription', //文件说明
                                   'LegalCopyright',  //版权
                                   'FileVersion',     //文件版本
                                   'CompanyName',     //公司名称 ï¼ˆæ— ï¼‰
                                            'LegalTradeMarks', //合法商标
                                   'InternalName',    //内部名称(无)
                                   'OriginalFileName');//源文件名(无)
  //版本信息
  glProductName, glProductVersion, glFileDescription, glLegalCopyright, glInternalName,
  glFileVersion, glCompanyName, glLegalTrademarks, glOriginalFilename:string;
  //界面显示版本和版权
  glVersion, glCopyright, glAppPath : String;
  //从授权文件解析机器码,授权期限,注册类型,密钥,密级等信息
  sDESMachineCode,sDESDate,sDESType,sDESKey,sDESLevel:string;
  //注册是否成功标志
  glRegSuccess : Boolean;
  //全局xml变量
  cfg : TConfigRec;
  //全局数据库名
  glConfig_db, glConn_db, glGrain_db, glData_db, glWeight_db, glManager_db : String;
  //全局变量
  glCalcOutput : String;      //计算器返回值
  glCurrFocus : Integer;      //当前输入的焦点编号
  glStartTest : Int64;        //开始检测的时间--毫秒
  glAutoRun   : Boolean;      //全局自启动标志
  glTime1, glTime2 : Integer; //下发粮种时间,检测时间(延时)
  glMsgPos  : TPoint;         //鼠标当前绝对坐标
  PlcConn   : TPlcRec;        //扦捡系统通讯参数
  WrConn    : TWrRec;         //水分仪通讯参数
  SysConfig : TConfigRec;     //系统参数
  Grain     : TGrainRec;      //粮种参数(含校准系数)
  Datas     : TDacRec;        //采集数据
  Wg        : TWeighgRec;     //重量校准参数
  //----全局业务变量-------------
  glCoef : array [0..4] of Double;
  //线程句柄
  m_TestThread, m_ManTestThread, m_VerifyThread : THandle;
  m_GrainThread, m_InterceptThread, m_ResetThread : THandle;
  //选择粮种线程标志,1-手动检测;2-手动校准
  s_Grain : Integer;
  //当前选中的粮种Index
  glCurrIndex : Integer;
  //设备句柄
  hPlcDev, hWrDev : Pointer;
  glConn_err : Integer;           //连接设备错误码
  glBtnTag, glBtnTag1 : Integer;  //按钮index
  glWg_k, glWg_b : double;        //全局临时重量系数
  //调试开关
  glIsDebug : Boolean;          //系统调试开关
  //数据存储
  smp : TSampleRec;             //数据样本结构
  //手写组件全局变量
  glInkOutput : String;
  //输入对话框全局变量
  glInput : String;         //粮种名称
  //glInputCod : Integer;     //大类cod
  //glInputCodnam : String;   //大类nam
  GrainType_rec : TGrainRec;//粮种大类rec
  //供线程回调函数使用
  gl_t_mos : Double;                        //计算出来的含水率
  gl_t_cod, gl_t_val, gl_t_err : Integer;   //粮种代码
  gl_log_old, gl_log_new : String;          //防止日志重复输出
  //分辨率类型
  gl_display_type : Integer;                //0-最大分辨率,1-1024X768,2-1024X600,3-其他
implementation
end.
src/pub/Global.~pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
{------------------------------------------------------------------------------}
{单元名称:Global.pas                                                          }
{模块名称:全局公共变量集                                                      }
{模块说明:包括全局变量、全局宏定义、参数数据结构等                            }
{建立日期:2009-12-20                                                          }
{修改修改:2024-10-14                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
//2024-10-14 å¢žåŠ gmmdata数据库,用来存储自动检测和手动检测的所有数据。
unit Global;
interface
uses
  Windows;
  {定义全局常量}
const
  NOTE = '警告:本计算机程序受著作权法和计算机软件保护条例保护,未经授权擅'
        +'自复制或传播本程序的部分或全部,可能受到严厉的民事及刑事制裁,并'
        +'将在法律许可的范围内受到最大可能的起诉。';
  CONFIG_DIR = 'config\';                             {配置文件夹}
  DATA_DIR = 'data\';                                 {数据文件夹}
  LOG_DIR = 'log\';                                   {日志文件夹}
  LOG_FILE = 'log4me.ini';                            {日志配置文件}
  LICENSE_FILE = 'License.lic';                       {授权文件}
  sConfig = 'Config.db';                              {配置文件}
  //config配置全局变量
  t_Config = 'config';                                {配置数据库-仪器参数}
  t_Conn   = 'conn';                                  {配置数据库-通讯参数}
  t_Grain  = 'grain';                                 {配置数据库-粮种参数}
  //t_Test   = 'test';                                {检测数据库-检测结果}
  t_Data   = 'data';                                  {检测数据库-自动和手动检测结果}
  t_Weight = 'weight';                                {重量校准数据库}
  t_Manager = 'manager';                              {登录口令数据库}
  //枚举运行模式
type RunMode = (rmAuto, rmManual);                    //自动模式=0,手动模式=1
//PLC配置参数
type
  TPlcRec = Record
    ip        : string;     //IP地址
    port      : integer;    //网络端口
end;
//WR配置参数
type
  TWrRec = Record
    SerialPort  : string;
    baud        : integer;
    parity      : char;
    data_bit    : integer;
    stop_bit    : integer;
end;
//config参数
type
  TConfigRec = Record
    Volume      : double;   //体积
    Tare        : double;   //皮重
    Freq        : double;   //频率码
    Decay       : double;   //衰减码
    Ask         : integer;  //ASK选择
    StartFreq   : double;   //起始频率
    StopFreq    : double;   //终止频率
    Step        : Integer;  //步长
    delay       : Integer;  //开机延迟时间s
    password    : string;   //手动模式登录口令
end;
//粮种信息参数
type
  TGrainRec = Record
    Code        : Integer;  //代码
    Name        : string;   //名称
    Coef        : array [0..4] of string; //校准系数
    Intercept   : string;   //截距
end;
//采集数据格式
type
  TDacRec = Record
    Voltage     : double;   //电压
    Weight      : double;   //重量
    Temp        : double;   //温度
    Humid       : double;   //湿度
end;
//重量校准格式
type
  TWeighgRec = Record
    //系数
    k           : double;  //y=kx+b
    b           : double;
    tare        : double;  //ȥƤ
    range       : double;  //±误差范围
    //У׼
    test1       : double;
    test2       : double;
    test3       : double;
    std1        : double;
    std2        : double;
    std3        : double;
end;
//测试样本存储结构
type
  TSampleRec = Record
    flag        : boolean;   //自动保存标志
    info        : string;    //样本信息
    prefix      : string;    //文件名前缀
    dir         : string;    //存储目录
end;
  {定义全局变量}
//------------------------------------------------------------------------------
var
  CompanyName:String;                                 {公司名称}
  FileDescription:String;                             {说明}
  FileVersion:String;                                 {文件版本}
  InternalName:String;                                {内部名称}
  LegalCopyright:String;                              {版权}
  LegalTrademarks:String;                             {合法商标}
  OriginalFilename:String;                            {源文件名}
  ProductName:String;                                 {产品名称}
  ProductVersion:String;                              {产品版本}
  Comments:String;                                    {备注}
  //版本信息专用数组
  glVerInfo:array[1..9] of string=('ProductName',     //产品名称
                                   'ProductVersion',  //产品版本
                                   'FileDescription', //文件说明
                                   'LegalCopyright',  //版权
                                   'FileVersion',     //文件版本
                                   'CompanyName',     //公司名称 ï¼ˆæ— ï¼‰
                                            'LegalTradeMarks', //合法商标
                                   'InternalName',    //内部名称(无)
                                   'OriginalFileName');//源文件名(无)
  //版本信息
  glProductName, glProductVersion, glFileDescription, glLegalCopyright, glInternalName,
  glFileVersion, glCompanyName, glLegalTrademarks, glOriginalFilename:string;
  //界面显示版本和版权
  glVersion, glCopyright, glAppPath : String;
  //从授权文件解析机器码,授权期限,注册类型,密钥,密级等信息
  sDESMachineCode,sDESDate,sDESType,sDESKey,sDESLevel:string;
  //注册是否成功标志
  glRegSuccess : Boolean;
  //全局xml变量
  cfg : TConfigRec;
  //全局数据库名
  glConfig_db, glConn_db, glGrain_db, glData_db, glWeight_db, glManager_db : String;
  //全局变量
  glCalcOutput : String;      //计算器返回值
  glCurrFocus : Integer;      //当前输入的焦点编号
  glStartTest : Int64;        //开始检测的时间--毫秒
  glAutoRun   : Boolean;      //全局自启动标志
  glTime1, glTime2 : Integer; //下发粮种时间,检测时间(延时)
  glMsgPos  : TPoint;         //鼠标当前绝对坐标
  PlcConn   : TPlcRec;        //plc通讯参数
  WrConn    : TWrRec;         //水分仪通讯参数
  SysConfig : TConfigRec;     //系统参数
  Grain     : TGrainRec;      //粮种参数(含校准系数)
  Datas     : TDacRec;        //采集数据
  Wg        : TWeighgRec;     //重量校准参数
  //----全局业务变量-------------
  glCoef : array [0..4] of Double;
  //线程句柄
  m_TestThread, m_ManTestThread, m_VerifyThread : THandle;
  m_GrainThread, m_InterceptThread, m_ResetThread : THandle;
  //选择粮种线程标志,1-手动检测;2-手动校准
  s_Grain : Integer;
  //当前选中的粮种Index
  glCurrIndex : Integer;
  //设备句柄
  hPlcDev, hWrDev : Pointer;
  glConn_err : Integer;           //连接设备错误码
  glBtnTag, glBtnTag1 : Integer;  //按钮index
  glWg_k, glWg_b : double;        //全局临时重量系数
  //调试开关
  glIsDebug : Boolean;          //系统调试开关
  //数据存储
  smp : TSampleRec;             //数据样本结构
implementation
end.
src/pub/MsgVar.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
{------------------------------------------------------------------------------}
{项目名称:项目全局常量                                                        }
{单元名称:MsgVar.pas                                                          }
{版本版次:2.1                                                                 }
{模块名称:消息变量库                                                          }
{功能描述:集中管理全局中文消息字符串                                          }
{建立日期:2017-09-15                                                          }
{修改修改:2023-01-27                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit MsgVar;
interface
const
  //----Message字符串-----------------------------------------------------------
  MSG_INFO = '提示';
  MSG_WARNING = '警告';
  MSG_ERROR = '错误';
  //----Load错误字符串----------------------------------------------------------
  //----uMain-------------------------------------------------------------------
  MSG_MN_SYSINFO = '系统信息: äº§å“åç§°[%s], ç‰ˆæœ¬[%s %s]';
  //----回调函数----------------------------------------------------------------
  //----指令--------------------------------------------------------------------
  //----界面设置----------------------------------------------------------------
  //----分析功能----------------------------------------------------------------
implementation
end.
src/pub/MultInst.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
{------------------------------------------------------------------------------}
{项目名称:公共项目                                                            }
{单元名称:MultInst.pas                                                        }
{版本版次:1.5                                                                 }
{模块名称:专用功能库                                                          }
{功能描述:解决应用程序多实例问题                                              }
{建立日期:2023-10-24                                                          }
{版权所有:李良庭                                                              }
{------------------------------------------------------------------------------}
// å·¥ä½œæµç¨‹
// ç¨‹åºè¿è¡Œå…ˆå–代原有向所有消息处理过程,然后广播一个消息.
// å¦‚果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄
// å‘送程序接收到此消息,激活收到消息的程序,然后关闭自己
unit MultInst;
interface
uses
 Windows ,Messages, SysUtils, Classes, Forms;
implementation
const
 STR_UNIQUE   = '{2BE6D96E-827F-4BF9-B33E-8740414CDEEE}';
 MI_ACTIVEAPP  =1;  {激活应用程序}
 MI_GETHANDLE  =2;  {取得句柄}
var
 iMessageID   : Integer;
 OldWProc     : TFNWndProc;
 MutHandle    : THandle;
 BSMRecipients : DWORD;
function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam:Longint):
 Longint; stdcall;
begin
 Result := 0;
 if Msg = iMessageID then
 begin
   case wParam of
    MI_ACTIVEAPP: {激活应用程序}
      if lParam<>0 then
      begin
        {收到消息的激活前一个实例}
        {在同一个进程中SetForegroundWindow并不能把窗体提到最前}
        if IsIconic(lParam) then
          OpenIcon(lParam)
        else
          SetForegroundWindow(lParam);
        Application.Terminate; {终止本实例}
      end;
    MI_GETHANDLE: {取得程序句柄}
      begin
        PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
          Application.Handle);
      end;
   end;
 end
 else
   Result :=CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;
procedure InitInstance;
begin
 {取代应用程序的消息处理}
 OldWProc   := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
   Longint(@NewWndProc)));
 {打开互斥对象}
 MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False,STR_UNIQUE);
 if MutHandle = 0 then
 begin
   {建立互斥对象}
   MutHandle := CreateMutex(nil,False, STR_UNIQUE);
 end
 else begin
  Application.ShowMainForm  := False;
   {已经有程序实例,广播消息取得实例句柄}
   BSMRecipients :=BSM_APPLICATIONS;
  BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
 end;
end;
initialization
 {注册消息}
 iMessageID  :=RegisterWindowMessage(STR_UNIQUE);
 InitInstance;
finalization
 {还原消息处理过程}
 if OldWProc <> Nil then
  SetWindowLong(Application.Handle, GWL_WNDPROC,LongInt(OldWProc));
 {关闭互斥对象}
 if MutHandle <> 0then CloseHandle(MutHandle);
end.
src/pub/PubUtils.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3854 @@
{------------------------------------------------------------------------------}
{项目名称:公共项目                                                            }
{单元名称:PubUtils.pas                                                        }
{版本版次:3.3                                                                 }
{模块名称:全局公共函数库                                                      }
{功能描述:维护通用公共函数调用                                                }
{建立日期:2011-01-01                                                          }
{修改修改:2025-02-12                                                          }
{版权所有:李良庭                                                              }
{------------------------------------------------------------------------------}
//2011-10-26 æ–°å¢žComboBox_XPMan_KeyPress函数,解决ComboBox控件输入乱码问题,
//           åœ¨KeyPress事件中执行ComboBox_XPMan_KeyPress即可解决。
//2015-12-01 æ–°å¢žBase16Encode、Base16Decode、Delay、GetVersionInfo等功能函数。
//2015-12-24 æ–°å¢žExcel操作函数,使用ADO方式连接Excel文件读写。
//2017-10-15 æ–°å¢žå±å¹•截图保存为png文件,传入文件路径,静默保存至本地,使用Tpngimage组件.
//2018-04-01 æ–°å¢žæ ¹æ®ç¨‹åºåç§°èŽ·å–å¥æŸ„çš„æ–¹æ³•ï¼Œæ”¯æŒè·¨è¿›ç¨‹å‘é€æ¶ˆæ¯ã€‚
//2018-10-20 ä¸ºæ•°é‡‡å¼€å‘平台新增Dll调用函数。
//2018-10-30 ä¼˜åŒ–公共函数库,去掉部分重复函数。
//2019-01-17 åŸºäºŽDateUtils库,扩充 DateTimeToUnix()函数,减8小时变成格林威治时间
//2022-09-20 å¢žåŠ ç§‘å­¦è®¡æ•°æ³•å’Œæµ®ç‚¹åž‹æ•°å­—äº’è½¬ï¼Œè¾“å…¥è¾“å‡ºå‡ä½¿ç”¨string类型。
//2023-11-01 å¢žåŠ æ£€æŸ¥ä¸²å£æ˜¯å¦å­˜åœ¨çš„å‡½æ•°ã€‚
//2025-02-12 å¢žåŠ æ•´å½¢è½¬ä¸ºå¸ƒå°”å€¼çš„å‡½æ•°ã€‚
unit PubUtils;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, Masks,
  Math, ShellApi, ShlObj, ComObj, ActiveX, Registry, Dialogs, StrUtils, Printers,
  Winsock, TLHelp32, PsAPI, DateUtils, Global;
// å­—符串相关
function IsInt(const S: string): Boolean;
function IsFloat(const S: string): Boolean;
function IsEmail(const S: string): Boolean;
function PathWithSlash(const Path: string): string;
function PathWithoutSlash(const Path: string): string;
function CombineFileName(const Path, FileName: string): string;
function FileExtWithDot(const FileExt: string): string;
function FileExtWithoutDot(const FileExt: string): string;
function AddNumberComma(Number: Int64): string;
function ExtractFileMainName(const FileName: string): string;
function ExtractUrlFilePath(const Url: string): string;
function ExtractUrlFileName(const Url: string): string;
function ValidateFileName(const FileName: string): string;
function GetSizeString(Bytes: Int64; const Postfix: string = ' KB'): string;
function GetPercentString(Position, Max: Int64; const Postfix: string = ' %'): string;
function RestrictStrWidth(const S: WideString; Canvas: TCanvas; Width: Integer; const Suffix: string = '...'): WideString;
function RestrictFileNameWidth(const FileName: string; MaxBytes: Integer): string;
function LikeString(Value, Pattern: WideString; CaseInsensitive: Boolean): Boolean;
procedure SplitString(S: string; Delimiter: Char; List: TStrings);
function StartWith(const Source: string; const Left: string): Boolean;
function EndWith(const Source: string; const Right: string): Boolean;
function MyPos(c: Char; const str: string): Integer;
// ç³»ç»Ÿç›¸å…³
function GetComputerName: string;
function GetWinUserName: string;
function GetWindowsDir: string;
function GetWinTempDir: string;
function GetWinTempFile(const PrefixStr: string = ''): string;
function GetFullFileName(const FileName: string): string;
function GetShortFileName(const FileName: string): string;
function GetLongFileName(const FileName: string): string;
function GetSpecialFolder(FolderID: Integer): string;
function GetQuickLaunchPath: string;
function GetSystemDrivePath: string;
function GetEnvVar(const EnvVar: string): string;
function GetWorkAreaRect: TRect;
function SelectDir(ParentHWnd: HWND; const Caption: string; const Root: WideString; var Path: string): Boolean;
function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): HWND;
function OpenURL(const URL: string): Boolean;
function OpenEmail(const Email: string): Boolean;
procedure SetStayOnTop(Form : TCustomForm; StayOnTop: Boolean);
procedure HideAppFromTaskBar;
function CheckLangChinesePR: Boolean;
function ShutdownWindows: Boolean;
function RebootWindows: Boolean;
function GetMouseCursorPos: TPoint;
function CreateShortCut(const OriginalFileName, ShortcutFileName, Arguments,
  WorkingDir, Description: string; ShowCmd: Integer; IsFolderShortcut: Boolean): Boolean;
// æ–‡ä»¶ç›¸å…³
function GetFileSize(const FileName: string): Int64;
function GetFolderSize(FolderName: string): Int64;
function GetFileDate(const FileName: string): TDateTime;
function SetFileDate(const FileName: string; CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean;
function CopyFileToFolder(FileName, BackupFolder: string): Boolean;
function AutoRenameFileName(const FullName: string): string;
function GetTempFileAtPath(const Path: string; const PrefixStr: string = ''): string;
function IsFileReadOnly(const FileName: string): Boolean;
function DeleteFileToRecycle(const FileName: string): Boolean;
procedure DeleteFileEx(FileName:string);
function DeleteDirectory(const Dir: string): Boolean;
function IsEmptyDir(sDir: String): Boolean;
function ReadFile(const sFile:String):String;     //读文本文件,liliangting 2016-01-18
function ReadLogFile(const sFile:String):String;  //读文本文件,liliangting 2016-01-18
procedure WriteLogFile(const sFile,sMsg: string); //写文本文件,liliangting 2016-01-18
// æ³¨å†Œè¡¨ç›¸å…³, å¢žåŠ æ³¨å†Œè¡¨è¯»å†™å‡½æ•°
function SetAutoRunOnStartup(AutoRun, CurrentUser: Boolean; AppTitle: string = ''; AppName: string = ''; AppPara: string = ''): Boolean;
procedure AutoRun(Flag: Boolean; title:String);
function ReadReg(const Name: String; CurrentUser: Boolean=true):String;
function WriteReg(const Name,Value: String; CurrentUser: Boolean=true):Boolean;
function AssociateFile(const FileExt, FileKey, SoftName, FileDesc: string; IconIndex: Integer = 0; Flush: Boolean = False): Boolean;
function SaveAppPath(const CompanyName, SoftName, Version: string): Boolean;
function ReadAppPath(const CompanyName, SoftName, Version: string; var Path: string): Boolean;
// æ—¥æœŸæ—¶é—´ç›¸å…³
function FileTimeToLocalSystemTime(FTime: TFileTime): TSystemTime;
function LocalSystemTimeToFileTime(STime: TSystemTime): TFileTime;
function GetDatePart(DateTime: TDateTime): TDate;
function GetTimePart(DateTime: TDateTime): TTime;
//获取硬件信息模块
function GetCPUIDStr:String;                              //获取CPUID并输出字符串
function GetMacAddress: string;                           //获取网卡MAC地址
function GetMemUse: Cardinal;                             //获取内存使用量
// å…¶å®ƒå‡½æ•°
procedure BeginWait;
procedure EndWait;
function Iif(Value: Boolean; Value1, Value2: Variant): Variant;
function Min(V1, V2: Integer): Integer;
function Max(V1, V2: Integer): Integer;
function TrimValue(Value, Min, Max: Integer): Integer;
procedure Swap(var V1, V2: Integer);
function GetTickDiff(const OldTickCount, NewTickCount: Cardinal): Cardinal;
function RestrictRectInScr(Rect: TRect; AllVisible: Boolean): TRect;
function GetModulePath: string;
function GetModuleSubPath(const SubFolder: string = ''): string;
function GetAppPath: string;
function GetAppSubPath(const SubFolder: string = ''): string;
function GetRectWidth(const R: TRect): Integer;
function GetRectHeight(const R: TRect): Integer;
procedure DrawStrokedText(Canvas: TCanvas; X, Y: Integer; const Text: string;
  FontColor, StrokedColor, SmoothColor: TColor);
//系统Bug修正
function GetScreenWidth:Integer;                //获取屏幕宽度和高度,即分辨率
function GetScreenHeight:Integer;
function GetDesktopWidth:Integer;               //获取桌面宽度和高度
function GetDesktopHeight:Integer;
function IsBigInt(const S:String): Boolean;            //2012-04-12增加
function  IsNTSystem:Boolean;                                   //判断是否NT系统
procedure ComboBox_XPMan_KeyPress(Sender:TObject;var Key: Char);//修正下拉选择框输入乱码
Function  formatNum(Number, Length: Integer): string;           //扩展并转换字符长度
Function  Q(s1:string):string;                                  //加单引号
procedure Delay(MSecs: Longint);                                //无刷新延时函数
procedure PreparePrinter(Width,Height:Integer);                 //自定义纸张打印程序
procedure DeleteMe;
procedure SetSystemDateFormat(sFormat:string='yyyy-MM-dd');     //设置系统日期格式
//其他函数,liliangting 2015-12-01
function  Base16Encode(const Src: AnsiString): AnsiString;                    //Base编码字符串
function  Base16Decode(const Src: AnsiString): AnsiString;                    //Base解码字符串
function  GetGUID:string;                                                     //自动生成一条GUID
procedure Delay1(MSecs: Longint);                                             //定时器1
procedure Delay2(MSecs: Longint);                                             //定时器2
procedure GetVersionInfo(AppExeName:string);
procedure EnumComPorts(Ports: TStrings);                                      //枚举系统COM口
function  CheckComPort(ComPortName: string; var ComPortList: Tstrings): boolean;
function  StrToHexStr(const S:string):string;                                 //字符串转16进制字符串
function  StrToHexStr1(const S:string):string;
function  HexStrToStr(const S:string; bFlag:boolean=false):string;            //16进制字符串转ASCII(支持中英文)
function  GetMemBytes(var X; size: Integer): string;                           //以十六进制方式查看内存的函数
procedure GetFileList(FilePath, ExtMask: string; FileList: TStrings; SubDir: Boolean = True);
procedure GetFileListEx(FilePath, ExtMask: string; FileList: TStrings; SubDir: Boolean = True);
function  DeleteDir(Path: string;IsDelDir: Boolean = False): Boolean;
//Excel函数,liliangting 2015-12-24
function GetInstalledWordVersion: Integer;                                    //获取Office版本
function RandomNum:String;                                                    //生成18位随机数
//TStringList自定义排序参数,liliangting 2017-9-1
function SortParam(List: TStringList; Index1, Index2: Integer): Integer;
function RoundEx(const Value: Extended; const Digit: Byte = 0): Extended;
//带中文的String转byte
function UniCode2GB(S: string): string;
function GB2UniCode(GB: string): string;
//重写BoolToStr函数,True-1,liliangting 2022-11-14
function BoolToHexStr(B: Boolean; UseBoolStrs: Boolean = False): string;
function BoolToString(B: Boolean; UseBoolStrs: Boolean = False): string;
function BoolToString1(B: Boolean; UseBoolStrs: Boolean = False): string;
function BoolToString2(B: Boolean; UseBoolStrs: Boolean = False): string;
function BoolToString3(B: Boolean; UseBoolStrs: Boolean = False): string;
function BoolToString4(B: Boolean; UseBoolStrs: Boolean = False): string;
//Int-->boolean,0-False,其他-True,liliangting 2025-02-12
function IntToBool(AValue: Integer): Boolean;
//将日期格式转换成Unix时间戳 , é•¿åº¦8字节,liliangting 2017-10-19
function DateTimeToUnixDate(const ADate: TDateTime): Longint;
//将数值转成KB、MB、GB
function FormatFileSize(size:Int64):String;
//将数值转成#.##万、#.##亿
function FormatNumberSize(num:Int64):String;
function SplitStr(str:string;chr:char;i:Integer):string;
function SplitStrCount(str:string; chr:char):Integer;
//windows杀进程的两种方法
procedure KillProgram(WindowTitle: string);
function KillTask(ExeFileName: string): integer;
//刷新任务栏图标的两种方法
procedure RefreshTaskbarIcon;
procedure RefreshTaskbarIcon2;
//强行关闭计算机系统的方法,liliangting 2018-1-4
function GetOperatingSystem(): string;
//跨进程传递消息的过程方法,liliangting 2018-04-01
function GetHWndByPID(const hPID: THandle): THandle;
function GetHwndByAppName(const AppName: String): THandle;
//-----------------------------------------------------------------------------
//数采开发平台专用方法
//liliangting 2018-10-20
//-----------------------------------------------------------------------------
//封装的动态Dll函数调用方法
function CallFunc(dllname,funcname:string; const param:array of const):DWORD;   //通用Dll调用方法
function PingHost(HostIP: String): Boolean;                                     //ping测试网络
function SecondToTime(sec:Integer):String;                                      //秒转时间字符串
function SecondToTime1(second: Word): TDateTime;                                //秒转时间
//扩充DateUtils库,增加北京时间转Int64时间格式,注意减去时区
function DateTimeToUnixPro(const AValue: TDateTime): Int64;
function UnixToDateTimePro(const AValue: Int64): TDateTime;
//科学计数与浮点型数互转,'-1.4857E-02' <--> '-0.014857'
function ExpToFloat(s:String):String;
function FloatToExp(s:String):String;
//------ å‡ ç§æ’值算法 ---------------------------------------------------------
function LinearInterpolation(x0, y0, x1, y1, x: Double): Double;                         //线性插值算法
function LagrangeInterpolation(x, y: array of Double; n: Integer; xi: Double): Double;   //拉格朗日插值算法
function NewtonInterpolation(x, fx: array of Double; n: Integer; t: Double): Double;     //牛顿插值算法
function LeastSquaresInterpolation(x, y: array of Double; n: Integer; t: Double): Double;//最小二乘法插值算法
function BayesianInterpolation(x,y: array of Double; xi: Double; sigma: Double): Double; //贝叶斯插值算法
//-----------------------------------------------------------------------------
function GetMillisecondTimeStamp: Int64;
function SwapHighLowWord(Value: Word): Word;
implementation
{$WARN SYMBOL_PLATFORM OFF}
{$WARN SYMBOL_DEPRECATED OFF}
type
  TCPUID = array[1..4] of Longint;//使用CPU内置指令获取CPU编号的二进制
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串 S æ˜¯ä¸æ˜¯ä¸€ä¸ªæ•´åž‹æ•°å­—
//-----------------------------------------------------------------------------
function IsInt(const S: string): Boolean;
var
  E, R: Integer;
begin
  Val(S, R, E);
  Result := E = 0;
  E := R; // avoid hints
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串 S æ˜¯ä¸æ˜¯ä¸€ä¸ªæµ®ç‚¹åž‹æ•°å­—
//-----------------------------------------------------------------------------
function IsFloat(const S: string): boolean;
var
  V: Extended;
begin
  Result := TextToFloat(PChar(S), V, fvExtended);
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串 S æ˜¯ä¸æ˜¯ä¸€ä¸ª Email åœ°å€
//-----------------------------------------------------------------------------
function IsEmail(const S: string): Boolean;
begin
  Result := True;
  if Pos('@', S) = 0 then Result := False;
  if Pos('.', S) = 0 then Result := False;
end;
//-----------------------------------------------------------------------------
// æè¿°: è¡¥å…¨è·¯å¾„字符串后面的 "\"
//-----------------------------------------------------------------------------
function PathWithSlash(const Path: string): string;
begin
  Result := Trim(Path);
  if Length(Result) > 0 then
    Result := IncludeTrailingPathDelimiter(Result);
end;
//-----------------------------------------------------------------------------
// æè¿°: åŽ»æŽ‰è·¯å¾„å­—ç¬¦ä¸²åŽé¢çš„ "\"
//-----------------------------------------------------------------------------
function PathWithoutSlash(const Path: string): string;
begin
  Result := Trim(Path);
  if Length(Result) > 0 then
    Result := ExcludeTrailingPathDelimiter(Result);
end;
//-----------------------------------------------------------------------------
// æè¿°: å°†è·¯å¾„和文件名组合在一起
//-----------------------------------------------------------------------------
function CombineFileName(const Path, FileName: string): string;
begin
  Result := PathWithSlash(Path) + FileName;
end;
//-----------------------------------------------------------------------------
// æè¿°: è¡¥å…¨æ–‡ä»¶æ‰©å±•名前面的 "."
//-----------------------------------------------------------------------------
function FileExtWithDot(const FileExt: string): string;
begin
  Result := FileExt;
  if Length(Result) > 0 then
    if Copy(Result, 1, 1) <> '.' then
      Result := '.' + Result;
end;
//-----------------------------------------------------------------------------
// æè¿°: åŽ»æŽ‰æ–‡ä»¶æ‰©å±•åå‰é¢çš„ "."
//-----------------------------------------------------------------------------
function FileExtWithoutDot(const FileExt: string): string;
begin
  Result := FileExt;
  if Length(Result) > 0 then
    if Copy(Result, 1, 1) = '.' then
      Delete(Result, 1, 1);
end;
//-----------------------------------------------------------------------------
// æè¿°: ç»™æ•°å­—加上分隔逗号
// ç¤ºä¾‹: 1234567 -> 1,234,567
//-----------------------------------------------------------------------------
function AddNumberComma(Number: Int64): string;
var
  Temp: Double;
begin
  Temp := Number;
  Result := Format('%.0n', [Temp]);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得文件名的主文件名
// ç¤ºä¾‹: "C:\test.dat" -> "test"
//-----------------------------------------------------------------------------
function ExtractFileMainName(const FileName: string): string;
var
  Ext: string;
begin
  Ext := ExtractFileExt(FileName);
  Result := ExtractFileName(FileName);
  Result := Copy(Result, 1, Length(Result) - Length(Ext));
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回URL中的文件路径
// ç¤ºä¾‹:
//   ExtractUrlFileName('http://www.download.com/file.zip');
//   æ­¤è°ƒç”¨å°†è¿”回 'http://www.download.com/'.
//-----------------------------------------------------------------------------
function ExtractUrlFilePath(const Url: string): string;
var
  I: Integer;
begin
  I := LastDelimiter('/\:', Url);
  Result := Copy(Url, 1, I);
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回URL中的文件名
// ç¤ºä¾‹:
//   ExtractUrlFileName('http://www.download.com/file.zip');
//   æ­¤è°ƒç”¨å°†è¿”回 'file.zip'.
//-----------------------------------------------------------------------------
function ExtractUrlFileName(const Url: string): string;
var
  I: Integer;
begin
  I := LastDelimiter('/\:', Url);
  Result := Copy(Url, I + 1, MaxInt);
end;
//-----------------------------------------------------------------------------
// æè¿°: åŽ»æŽ‰æ–‡ä»¶åä¸­ä¸åˆæ³•çš„å­—ç¬¦
// ç¤ºä¾‹: "tes*t.dat?" -> "test.dat"
//-----------------------------------------------------------------------------
function ValidateFileName(const FileName: string): string;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to Length(FileName) do
  begin
    if not (AnsiChar(FileName[I]) in ['\', '/', ':', '*', '?', '"', '<', '>', '|']) and
      not (Ord(FileName[I]) < 32) then
      Result := Result + FileName[I];
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得一个用来描述字节数的字符串
// å‚æ•°:
//   Bytes   - å­—节数
//   Postfix - å•位后缀,缺省为 " KB"
//-----------------------------------------------------------------------------
function GetSizeString(Bytes: Int64; const Postfix: string): string;
var
  Temp: Double;
begin
  if Bytes > 0 then
  begin
    Temp := Bytes div 1024;
    if Bytes mod 1024 <> 0 then Temp := Temp + 1;
  end else
    Temp := 0;
  Result := Format('%s%s', [Format('%.0n', [Temp]), Postfix]);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得一个用来描述百分比的字符串
// å‚æ•°:
//   Position, Max   - å½“前值 å’Œ æœ€å¤§å€¼
//   Postfix         - åŽç¼€å­—符串,缺省为 " %"
//-----------------------------------------------------------------------------
function GetPercentString(Position, Max: Int64; const Postfix: string): string;
begin
  if Max > 0 then
    Result := IntToStr(Trunc((Position / Max) * 100)) + Postfix
  else
    Result := '100' + Postfix;
end;
//-----------------------------------------------------------------------------
// æè¿°: ç¼©çŸ­å­—符串的长度以适应显示宽度
// å‚æ•°:
//   S       - å¾…缩短的字符串.
//   Canvas  - å­—符串所在的Canvas.
//   Width   - æœ€å¤§è±¡ç´ å®½åº¦
//   Suffix  - å¦‚果字符串被截断,则添加什么后缀
// è¿”回:
//   ç¼©çŸ­ä¹‹åŽçš„字符串
//-----------------------------------------------------------------------------
function RestrictStrWidth(const S: WideString; Canvas: TCanvas;
  Width: Integer; const Suffix: string): WideString;
var
  Src: WideString;
begin
  Src := S;
  Result := S;
  while (Canvas.TextWidth(Result) > Width) and (Length(Result) > 0) do
  begin
    if Length(Src) > 1 then
    begin
      Delete(Src, Length(Src), 1);
      Result := Src + Suffix;
    end else
      Delete(Result, Length(Result), 1);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: ç¼©çŸ­æ–‡ä»¶åçš„长度以适应最大字节数限制
// å‚æ•°:
//   FileName - å¾…缩短的文件名(可以包含路径)
//   MaxBytes - æœ€å¤§å­—节数
// è¿”回:
//   ç¼©çŸ­ä¹‹åŽçš„æ–‡ä»¶åå­—符串
//-----------------------------------------------------------------------------
function RestrictFileNameWidth(const FileName: string;
  MaxBytes: Integer): string;
  function GetBytes(const S: WideString): Integer;
  var
    AnsiStr: string;
  begin
    AnsiStr := S;
    Result := Length(AnsiStr);
  end;
var
  MainName, NewMainName: WideString;
  Ext: string;
  ExtLen: Integer;
begin
  if Length(FileName) <= MaxBytes then
  begin
    Result := FileName;
  end else
  begin
    Ext := ExtractFileExt(FileName);
    MainName := Copy(FileName, 1, Length(FileName) - Length(Ext));
    ExtLen := Length(Ext);
    NewMainName := MainName;
    while (GetBytes(NewMainName) + ExtLen > MaxBytes) and (Length(NewMainName) > 0) do
    begin
      if Length(MainName) > 1 then
      begin
        Delete(MainName, Length(MainName), 1);
        NewMainName := MainName + '...';
      end else
        Delete(NewMainName, Length(NewMainName), 1);
    end;
    Result := NewMainName + Ext;
    if Length(Result) > MaxBytes then
      Result := Copy(Result, 1, MaxBytes);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°ï¼šè®¡ç®—通配符表达式,支持通配符'*' å’Œ '?'
// å‚数:
//   Value            - æ¯ä¸²
//   Pattern          - å­ä¸²
//   CaseInsensitive  - æ˜¯å¦å¿½ç•¥å¤§å°å†™
// è¿”回:
//   True  -  åŒ¹é…
//   False -  ä¸åŒ¹é…
// ç¤ºä¾‹ï¼š
//   LikeString('abcdefg', 'abc*', True);
//-----------------------------------------------------------------------------
function LikeString(Value, Pattern: WideString; CaseInsensitive: Boolean): Boolean;
const
  MultiWildChar = '*';
  SingleWildChar = '?';
var
  ValuePtr, PatternPtr: PWideChar;
  I: Integer;
  B: Boolean;
begin
  ValuePtr := PWideChar(Value);
  PatternPtr := PWideChar(Pattern);
  while True do
  begin
    if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT,
      PatternPtr, Length(PatternPtr), WideChar(MultiWildChar), 1) - 2 = 0) then
    begin
      Result := True;
      Exit;
    end
    else if (ValuePtr^ = #0) and (PatternPtr^ <> #0) then
    begin
      Result := False;
      Exit;
    end
    else if (ValuePtr^ = #0) then
    begin
      Result := True;
      Exit;
    end else
    begin
      case PatternPtr^ of
        MultiWildChar:
          begin
            for I := 0 to Length(ValuePtr) - 1 do
            begin
              if LikeString(ValuePtr + I, PatternPtr + 1, CaseInsensitive) then
              begin
                Result := True;
                Exit;
              end;
            end;
            Result := False;
            Exit;
          end;
        SingleWildChar:
          begin
            Inc(ValuePtr);
            Inc(PatternPtr);
          end;
      else
        begin
          B := False;
          if CaseInsensitive then
          begin
            if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE + SORT_STRINGSORT,
              PatternPtr, 1, ValuePtr, 1) - 2 = 0) then
              B := True;
          end else
          begin
            if (CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT,
              PatternPtr, 1, ValuePtr, 1) - 2 = 0) then
              B := True;
          end;
          if B then
          begin
            Inc(ValuePtr);
            Inc(PatternPtr);
          end else
          begin
            Result := False;
            Exit;
          end;
        end;
      end; // case
    end;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ†å‰²å­—符串
//-----------------------------------------------------------------------------
procedure SplitString(S: string; Delimiter: Char; List: TStrings);
var
  I: Integer;
begin
  List.Clear;
  while Length(S) > 0 do
  begin
    I := Pos(Delimiter, S);
    if I > 0 then
    begin
      List.Add(Copy(S, 1, I - 1));
      Delete(S, 1, I);
    end else
    begin
      List.Add(S);
      Break;
    end;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串 Source æ˜¯ä¸æ˜¯ä»¥ Left å¼€å§‹
//-----------------------------------------------------------------------------
function StartWith(const Source: string; const Left: string): Boolean;
var
  Start: string;
  Len: Integer;
begin
  Len := Length(Left);
  if (Source = '') or (Left = '') or (Length(Source) < Len) then
  begin
    Result := False;
  end else
  begin
    Start := Copy(Source, 1, Len);
    Result := Start = Left;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串 Source æ˜¯ä¸æ˜¯ä»¥ Right ç»“束
//-----------------------------------------------------------------------------
function EndWith(const Source: string; const Right: string): Boolean;
var
  EndStr: string;
  RightLen: Integer;
  SourceLen: Integer;
begin
  RightLen := Length(Right);
  SourceLen := Length(Source);
  if (Source = '') or (Right = '') or (SourceLen < RightLen) then
  begin
    Result := False;
  end else
  begin
    EndStr := Copy(Source, SourceLen - RightLen + 1, RightLen);
    Result := EndStr = Right;
  end;
end;
//------------------------------------------------------------------------------
// æè¿°ï¼šPos å‡½æ•°ï¼Œè¿”回查找字符出现次数
//------------------------------------------------------------------------------
function MyPos(c: Char; const str: string): Integer;
var
  i,j: Integer;
begin
  j := 0;
  for i := 1 to Length(str) do
    if c = str[i] then inc(j);
  Result:=j;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得计算机名
//-----------------------------------------------------------------------------
function GetComputerName: string;
const
  MaxSize = 256;
var
  Buffer: array[0..MaxSize-1] of Char;
  Size: Cardinal;
begin
  Size := MaxSize;
  Windows.GetComputerName(PChar(@Buffer[0]), Size);
  Result := Buffer;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得当前系统用户名
//-----------------------------------------------------------------------------
function GetWinUserName: string;
const
  Size = 255;
var
  Buffer: array[0..Size] of Char;
  Len: DWord;
begin
  Len := Size;
  GetUserName(Buffer, Len);
  Result := Buffer;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–å¾— Windows ç›®å½•
//-----------------------------------------------------------------------------
function GetWindowsDir: string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(Buffer, MAX_PATH);
  Result := PathWithSlash(Buffer);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得系统临时文件目录
//-----------------------------------------------------------------------------
function GetWinTempDir: string;
const
  Size = 1024;
var
  Buffer: array[0..Size] of Char;
  LongName: string;
begin
  GetTempPath(Size, Buffer);
  Result := PathWithSlash(Buffer);
  LongName := GetLongFileName(Result);
  if Length(LongName) >= Length(Result) then
    Result := LongName;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得一个临时文件名(路径为系统临时目录)
// å‚æ•°:
//   PrefixStr - æ–‡ä»¶åå‰ç¼€ï¼Œå‰ä¸‰ä¸ªå­—符有效
//-----------------------------------------------------------------------------
function GetWinTempFile(const PrefixStr: string): string;
var
  FileName: array[0..MAX_PATH] of Char;
  LongName: string;
begin
  Windows.GetTempFileName(PChar(GetWinTempDir), PChar(PrefixStr), 0, FileName);
  Result := FileName;
  LongName := GetLongFileName(Result);
  if Length(LongName) >= Length(Result) then
    Result := LongName;
end;
//-----------------------------------------------------------------------------
// æè¿°: æ–‡ä»¶çš„全名(包含路径)
// ç¤ºä¾‹:
//   "test.dat" -> "C:\test.dat"
//   "C:\a\..\test.dat" -> "C:\test.dat"
//-----------------------------------------------------------------------------
function GetFullFileName(const FileName: string): string;
const
  Size = 1024;
var
  Buffer: array[0..Size] of Char;
  FileNamePtr: PChar;
  Len: DWord;
begin
  Len := Size;
  GetFullPathName(PChar(FileName), Len, Buffer, FileNamePtr);
  Result := Buffer;
end;
//-----------------------------------------------------------------------------
// æè¿°: é•¿æ–‡ä»¶å -> çŸ­æ–‡ä»¶å(8.3)
// å¤‡æ³¨: FileName å¯ä»¥æ˜¯è·¯å¾„,也可以是文件名。
// ç¤ºä¾‹:
//   "C:\Program Files" -> "C:\PROGRA~1"
//-----------------------------------------------------------------------------
function GetShortFileName(const FileName: string): string;
const
  Size = 1024;
var
  Buffer: array[0..Size] of Char;
begin
  GetShortPathName(PChar(FileName), Buffer, Size);
  Result := Buffer;
end;
//-----------------------------------------------------------------------------
// æè¿°: çŸ­æ–‡ä»¶å(8.3) -> é•¿æ–‡ä»¶å
// å¤‡æ³¨: FileName å¯ä»¥æ˜¯è·¯å¾„,也可以是文件名。
// ç¤ºä¾‹:
//   "C:\PROGRA~1\COMMON~1\" -> "C:\Program Files\Common Files\"
//-----------------------------------------------------------------------------
function GetLongFileName(const FileName: string): string;
var
  Name, S: string;
  SearchRec : TSearchRec;
begin
  S := ExcludeTrailingPathDelimiter(FileName);
  if (Length(S) < 3) or (ExtractFilePath(S) = S) then
  begin
    Result := FileName;
    Exit;
  end;
  if FindFirst(S, faAnyFile, SearchRec) = 0 then
    Name := SearchRec.Name
  else
    Name := ExtractFileName(S);
  FindClose(SearchRec);
  Result := GetLongFileName(ExtractFilePath(S)) + Name;
  if Length(S) <> Length(FileName) then Result := Result + '\';
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得特殊文件夹路径
// å‚æ•°:
//   FolderID -
//      CSIDL_DESKTOP
//      CSIDL_PROGRAMS
//      CSIDL_RECENT
//      CSIDL_SENDTO
//      CSIDL_STARTMENU
//      CSIDL_STARTUP
//      CSIDL_TEMPLATES
//      CSIDL_APPDATA
// è¿”回:
//   è‹¥æˆåŠŸï¼Œè¿”å›žå¸¦æœ€åŽæ–œçº¿(\)的路径;
//   è‹¥å¤±è´¥ï¼Œè¿”回空字符串。
// å¤‡æ³¨:
//   è‹¥è¦å–"快速启动"的路径,可:
//   GetSpecialFolder(CSIDL_APPDATA) + 'Microsoft\Internet Explorer\Quick Launch\'.
//-----------------------------------------------------------------------------
function GetSpecialFolder(FolderID: Integer): string;
var
  PidL: PItemIDList;
  Buffer: array[0..MAX_PATH] of Char;
  Malloc: IMalloc;
begin
  Result := '';
  if Failed(SHGetMalloc(Malloc)) then
    Malloc := nil;
  if Succeeded(SHGetSpecialFolderLocation(0, FolderID, PidL)) then
  begin
    if SHGetPathFromIDList(PidL, Buffer) then
      Result := Buffer;
    if Assigned(Malloc) then
      Malloc.Free(PidL);
    Result := PathWithSlash(Result);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–å¾— "快速启动" çš„路径
//-----------------------------------------------------------------------------
function GetQuickLaunchPath: string;
begin
  Result := GetSpecialFolder(CSIDL_APPDATA) +
    'Microsoft\Internet Explorer\Quick Launch\';
end;
//-----------------------------------------------------------------------------
// æè¿°: å–å¾— SystemDrive çš„路径
//-----------------------------------------------------------------------------
function GetSystemDrivePath: string;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    Result := GetEnvVar('SystemDrive')  {don't localize}
  else
    Result := '';
  if Result = '' then
  begin
    Result := ExtractFileDrive(GetWindowsDir);
    if Result = '' then
      Result := 'C:';
  end;
  Result := PathWithSlash(Result);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得环境变量的值
//-----------------------------------------------------------------------------
function GetEnvVar(const EnvVar: string): string;
  function AdjustLength(var S: string; const R: Cardinal): Boolean;
  begin
    Result := Integer(R) < Length(S);
    SetLength(S, R);
  end;
const
  MaxSize = 255;
var
  R: DWORD;
begin
  SetLength(Result, MaxSize);
  repeat
    R := GetEnvironmentVariable(PChar(EnvVar), PChar(Result), Length(Result));
    if R = 0 then
    begin
      Result := '';
      Break;
    end;
  until AdjustLength(Result, R);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得桌面上除任务栏以外的区域
//-----------------------------------------------------------------------------
function GetWorkAreaRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
//-----------------------------------------------------------------------------
// æè¿°: æµè§ˆæ–‡ä»¶å¤¹ï¼Œå¯å®šä½æ–‡ä»¶å¤¹
// å‚æ•°:
//   ParentHWnd - çˆ¶çª—口的句柄
//   Caption    - æµè§ˆå¯¹è¯æ¡†çš„æç¤ºæ ‡é¢˜
//   Root       - æ ¹ç›®å½•
//   Path       - å­˜æ”¾ç”¨æˆ·æœ€ç»ˆé€‰æ‹©çš„目录
// è¿”回:
//   True  - ç”¨æˆ·ç‚¹äº†ç¡®å®š
//   False - ç”¨æˆ·ç‚¹äº†å–消
//-----------------------------------------------------------------------------
function SelectDir(ParentHWnd: HWND; const Caption: string;
  const Root: WideString; var Path: string): Boolean;
const
{$WRITEABLECONST ON}
  InitPath: string = '';
{$WRITEABLECONST OFF}
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
  function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: Cardinal; lpData: Cardinal):Integer; stdcall;
  var
    R: TRect;
  begin
    if uMsg = BFFM_INITIALIZED then
    begin
      GetWindowRect(hwnd, R);
      MoveWindow(hwnd,
        (Screen.Width - (R.Right - R.Left)) div 2,
        (Screen.Height - (R.Bottom - R.Top)) div 2,
        R.Right - R.Left,
        R.Bottom - R.Top,
        True);
      Result := SendMessage(hwnd, BFFM_SETSELECTION, Ord(TRUE), Longint(PChar(InitPath)))
    end else
      Result := 1;
  end;
begin
  Result := False;
  InitPath := Path;
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if Root <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
          POleStr(Root), Eaten, RootItemIDList, Flags);
      end;
      with BrowseInfo do
      begin
        hwndOwner := ParentHWnd;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS;
        lpfn :=@BrowseCallbackProc;
        lParam :=BFFM_INITIALIZED;
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result :=  ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Path := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: ç”¨ç³»ç»Ÿ Shell è°ƒç”¨æ¥æ‰“开一个文件
//-----------------------------------------------------------------------------
function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): HWND;
begin
  Result := ShellExecute(Application.Handle, nil,
    PChar(FileName), PChar(Params), PChar(DefaultDir), ShowCmd);
end;
//-----------------------------------------------------------------------------
// æè¿°: æ‰“开一个 URL
// ç¤ºä¾‹:
//   OpenURL('http://www.abc.com');
//   OpenURL('www.abc.com');
//   OpenURL('file:///c:\');
//-----------------------------------------------------------------------------
function OpenURL(const URL: string): Boolean;
begin
  Result := ShellExecute(Application.Handle, 'Open', PChar(Trim(URL)), '', '', SW_SHOW) > 32;
end;
//-----------------------------------------------------------------------------
// æè¿°: æ‰“开一个 Email å‘送客户端
//-----------------------------------------------------------------------------
function OpenEmail(const Email: string): Boolean;
const
  SPrefix = 'mailto:';
var
  S: string;
begin
  S := Trim(Email);
  if Pos(SPrefix, S) <> 1 then S := SPrefix + S;
  Result := OpenURL(S);
end;
//-----------------------------------------------------------------------------
// æè¿°: è®©çª—口保持在最上层
//-----------------------------------------------------------------------------
procedure SetStayOnTop(Form : TCustomForm; StayOnTop: Boolean);
begin
  if StayOnTop Then
    SetWindowPos(Form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
  else
    SetWindowPos(Form.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);
end;
//-----------------------------------------------------------------------------
// æè¿°: éšè—åº”用程序在任务栏上的选择按钮
//-----------------------------------------------------------------------------
procedure HideAppFromTaskBar;
var
  ExtendedStyle : Integer;
begin
  ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    (ExtendedStyle or WS_EX_TOOLWINDOW) and not WS_EX_APPWINDOW);
end;
//-----------------------------------------------------------------------------
// æè¿°: æ£€æŸ¥å½“前系统语言是否简体中文
//-----------------------------------------------------------------------------
function CheckLangChinesePR: Boolean;
const
  // LCID Consts
  LangChinesePR = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;
begin
  Result := SysLocale.DefaultLCID = LangChinesePR;
end;
//-----------------------------------------------------------------------------
// æè¿°: å…³æœº
//-----------------------------------------------------------------------------
function ShutdownWindows: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  tkpo: TTokenPrivileges;
  Zero: DWORD;
begin
  Result := True;
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    Zero := 0;
    if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    begin
      Result := False;
      Exit;
    end;
    if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then
    begin
      Result := False;
      Exit;
    end;
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, Zero);
    if Boolean(GetLastError()) then
    begin
      Result := False;
      Exit;
    end else
      ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
  end else
    ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
//------------------------------------------------------------------------------
// æè¿°ï¼šé‡å¯
//------------------------------------------------------------------------------
function RebootWindows: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  tkpo: TTokenPrivileges;
  Zero: DWORD;
begin
  Result := True;
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    Zero := 0;
    if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    begin
      Result := False;
      Exit;
    end;
    if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then
    begin
      Result := False;
      Exit;
    end;
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, Zero);
    if Boolean(GetLastError()) then
    begin
      Result := False;
      Exit;
    end else
      ExitWindowsEx(EWX_SHUTDOWN or EWX_REBOOT, 0);
  end else
    ExitWindowsEx(EWX_SHUTDOWN or EWX_REBOOT, 0);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–鼠标的当前位置
// æ³¨æ„: Mouse.CursorPos ä¼šåœ¨å¸¦å¯†ç ä¿æŠ¤çš„屏保启动时抛出异常。
//-----------------------------------------------------------------------------
function GetMouseCursorPos: TPoint;
begin
  if not Windows.GetCursorPos(Result) then
    Result := Point(0, 0);
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ›å»ºå¿«æ·æ–¹å¼
// å‚æ•°:
//   OriginalFileName - åŽŸå§‹æ–‡ä»¶åï¼Œå«è·¯å¾„ (即快捷方式指向的文件)
//   ShortcutFileName - å¿«æ·æ–¹å¼æ–‡ä»¶åï¼Œå«è·¯å¾„,含扩展名(.lnk)
//   Arguments        - è¿è¡Œå‚æ•°
//   WorkingDir       - å·¥ä½œç›®å½•
//   Description      - å¿«æ·æ–¹å¼æè¿°
//   ShowCmd          - è¿è¡Œæ–¹å¼ (SW_SHOW, SW_MINIMIZE, SW_MAXIMIZE)
//   IsFolderShortcut - æ˜¯å¦æ–‡ä»¶å¤¹å¿«æ·æ–¹å¼
// è¿”回:
//   True  - æˆåŠŸ
//   False - å¤±è´¥
//-----------------------------------------------------------------------------
function CreateShortCut(const OriginalFileName, ShortcutFileName, Arguments,
  WorkingDir, Description: string; ShowCmd: Integer;
  IsFolderShortcut: Boolean): Boolean;
  function IsWindowsXP: Boolean;
  begin
    Result := (Win32Platform >= VER_PLATFORM_WIN32_NT) and
      (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1);
  end;
const
  CLSID_FolderShortcut: TGUID = (
    D1:$0AFACED1; D2:$E828; D3:$11D1; D4:($91,$87,$B5,$32,$F1,$E9,$57,$5D));
var
  OleResult: HRESULT;
  Obj: IUnknown;
  SL: IShellLink;
  PF: IPersistFile;
  WideFileName: WideString;
begin
  if IsFolderShortcut then
  begin
    try
      Obj := CreateComObject(CLSID_FolderShortcut);
    except
      { Folder shortcuts aren't supported prior to Windows 2000/Me.
        Fall back to creating a normal shell link. }
      Obj := nil;
    end;
  end;
  if Obj = nil then
  begin
    IsFolderShortcut := False;
    Obj := CreateComObject(CLSID_ShellLink);
  end;
  SL := Obj as IShellLink;
  SL.SetPath(PChar(OriginalFileName));
  SL.SetArguments(PChar(Arguments));
  if WorkingDir <> '' then
    SL.SetWorkingDirectory(PChar(WorkingDir));
  SL.SetShowCmd(ShowCmd);
  if Description <> '' then
    SL.SetDescription(PChar(Description));
  PF := SL as IPersistFile;
  { When creating a folder shortcut on 2000/Me, IPersistFile::Save will strip
    off everything past the last '.' in the ShortcutFileName, so we keep the .lnk
    extension on to give it something harmless to strip off. XP doesn't do
    that, so we must remove the .lnk extension ourself. }
  if IsFolderShortcut and IsWindowsXP then
    WideFileName := ChangeFileExt(ShortcutFileName, '')
  else
    WideFileName := ShortcutFileName;
  OleResult := PF.Save(PWideChar(WideFileName), True);
  Result := OleResult = S_OK;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得文件大小
//-----------------------------------------------------------------------------
function GetFileSize(const FileName: string): Int64;
var
  Handle: THandle;
  FindData: TWin32FindData;
begin
  Result := -1;
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      Int64Rec(Result).Lo := FindData.nFileSizeLow;
      Int64Rec(Result).Hi := FindData.nFileSizeHigh;
    end;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得文件夹大小
//-----------------------------------------------------------------------------
function GetFolderSize(FolderName: string): Int64;
var
  sr: TSearchRec;
begin
  Result := 0;
  if RightStr(FolderName, 1) <> '\' then FolderName := FolderName + '\';
  if FindFirst(FolderName + '*.* ', faAnyFile, sr) = 0 then
    repeat
      if (sr.Name <> '.') and (sr.Name <> '..') then begin
        Result := Result + GetFileSize(FolderName + sr.Name);
        if (sr.Attr and faDirectory) <> 0 then
          Result := Result + GetFolderSize(FolderName + sr.Name + '\');
      end;
    until FindNext(sr) <> 0;
  FindClose(sr);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得文件的修改时间
//-----------------------------------------------------------------------------
function GetFileDate(const FileName: string): TDateTime;
var
  FileDate: Integer;
begin
  FileDate := FileAge(FileName);
  if FileDate = -1 then
    Result := 0
  else
    Result := FileDateToDateTime(FileDate);
end;
//-----------------------------------------------------------------------------
// æè¿°: è®¾ç½®æ–‡ä»¶çš„æ—¶é—´
//-----------------------------------------------------------------------------
function SetFileDate(const FileName: string;
  CreationTime, LastWriteTime, LastAccessTime: TFileTime): Boolean;
var
  FileHandle : Integer;
begin
  FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
  try
    if FileHandle <> Integer(INVALID_HANDLE_VALUE) then
    begin
      SetFileTime(FileHandle, @CreationTime, @LastAccessTime, @LastWriteTime);
      Result := True;
    end else
      Result := False;
  finally
    FileClose(FileHandle);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å¤åˆ¶æ–‡ä»¶åˆ°ä¸€ä¸ªæ–‡ä»¶å¤¹
//-----------------------------------------------------------------------------
function CopyFileToFolder(FileName, BackupFolder: string): Boolean;
var
  MainFileName: string;
begin
  BackupFolder := PathWithSlash(BackupFolder);
  MainFileName := ExtractFileName(FileName);
  ForceDirectories(BackupFolder);
  Result := CopyFile(PChar(FileName), PChar(BackupFolder + MainFileName), False);
end;
//-----------------------------------------------------------------------------
// æè¿°: è‡ªåŠ¨è°ƒæ•´æ–‡ä»¶åï¼Œé˜²æ­¢æ–‡ä»¶åé‡å¤
// å‚æ•°:
//   FullName - æ–‡ä»¶çš„全路径名
// ç¤ºä¾‹ï¼š
//   NewName := AutoRenameFileName('C:\Downloads\test.dat');
//   å¦‚æžœ "C:\Downloads\" ä¸‹å·²ç»å­˜åœ¨test.dat,则函数返回 "C:\Downloads\test(1).dat".
//-----------------------------------------------------------------------------
function AutoRenameFileName(const FullName: string): string;
const
  SLeftSym = '(';
  SRightSym = ')';
  // è‹¥S='test(1)',则返回'(1)'; è‹¥S='test(a)',则返回''。
  function GetNumberSection(const S: string): string;
  var
    I: Integer;
  begin
    Result := '';
    if Length(S) < 3 then Exit;
    if S[Length(S)] = SRightSym then
    begin
      for I := Length(S) - 2 downto 1 do
        if S[I] = SLeftSym then
        begin
          Result := Copy(S, I, MaxInt);
          Break;
        end;
    end;
    if Length(Result) > 0 then
    begin
      if not IsInt(Copy(Result, 2, Length(Result)-2)) then
        Result := '';
    end;
  end;
var
  Number: Integer;
  Name, Ext, NumSec: string;
begin
  Ext := ExtractFileExt(FullName);
  Result := FullName;
  while FileExists(Result) do
  begin
    Name := Copy(Result, 1, Length(Result) - Length(Ext));
    NumSec := GetNumberSection(Name);
    if Length(NumSec) = 0 then
    begin
      Result := Name + SLeftSym + '1' + SRightSym + Ext;
    end else
    begin
      Number := StrToInt(Copy(NumSec, 2, Length(NumSec)-2));
      Inc(Number);
      Result := Copy(Name, 1, Length(Name) - Length(NumSec)) +
        SLeftSym + IntToStr(Number) + SRightSym + Ext;
    end;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得一个临时文件名
// å‚æ•°:
//   Path      - ä¸´æ—¶æ–‡ä»¶æ‰€åœ¨è·¯å¾„
//   PrefixStr - æ–‡ä»¶åå‰ç¼€ï¼Œå‰ä¸‰ä¸ªå­—符有效
//-----------------------------------------------------------------------------
function GetTempFileAtPath(const Path: string; const PrefixStr: string): string;
var
  I: Integer;
begin
  I := 1;
  while True do
  begin
    Result := PathWithSlash(Path) + Copy(PrefixStr, 1, 3) + IntToStr(I) + '.tmp';
    if FileExists(Result) then
      Inc(I)
    else
      Break;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­æ–‡ä»¶æ˜¯å¦å…·æœ‰åªè¯»å±žæ€§
//-----------------------------------------------------------------------------
function IsFileReadOnly(const FileName: string): Boolean;
begin
  Result := (GetFileAttributes(PChar(FileName)) and FILE_ATTRIBUTE_READONLY) <> 0;
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ é™¤æ–‡ä»¶åˆ°å›žæ”¶ç«™
//-----------------------------------------------------------------------------
function DeleteFileToRecycle(const FileName: string): Boolean;
var
  OpStruct: TSHFileOpStruct;
begin
  FillChar(OpStruct, SizeOf(OpStruct), 0);
  with OpStruct do
  begin
    Wnd := 0;
    wFunc := FO_DELETE;
    pFrom := PChar(FileName);
    fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;
  end;
  Result := SHFileOperation(OpStruct) = 0;
end;
//------------------------------------------------------------------------------
// æè¿°ï¼šæ¨¡ç³ŠåŒ¹é…åˆ é™¤æ–‡ä»¶
//------------------------------------------------------------------------------
procedure DeleteFileEx(FileName:string);
var
    FileDir:string;
    FileStruct:TSHFileOpStruct;
begin
    FileDir := FileName;// 'C:\temp\*.txt';
    FileStruct.Wnd :=0;
    FileStruct.wFunc := FO_delete;
    FileStruct.pFrom := Pchar(FileDir+#0);
    FileStruct.fFlags:= FOF_NOCONFIRMATION;
    FileStruct.pTo := ' ';
    if SHFileOperation(FileStruct)=0 then
      MessageBox(0,'注意: ç»¼åˆæµ‹è¯•台仪器测量数据已经清空!','提示',MB_OK+MB_ICONINFORMATION);
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ é™¤ç©ºæˆ–非空目录
//-----------------------------------------------------------------------------
function DeleteDirectory(const Dir: string): Boolean;
var
  FileOp: TSHFileOpStruct;
begin
  FillChar(FileOp, SizeOf(FileOp), 0);
  with FileOp do
  begin
    Wnd := 0;
    wFunc := FO_DELETE;
    pFrom := PChar(Dir + #0);
    pTo := #0#0;
    fFlags := FOF_NOCONFIRMATION + FOF_SILENT;
  end;
  Result := (SHFileOperation(FileOp) = 0);
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­ç›®å½•是否为空
//-----------------------------------------------------------------------------
function IsEmptyDir(sDir: String): Boolean;
var
  sr: TsearchRec;
begin
  Result := True;
  if Copy(sDir, Length(sDir) - 1, 1) <> '\' then sDir := sDir + '\';
  if FindFirst(sDir + '*.*', faAnyFile, sr) = 0 then
    repeat
      if (sr.Name <> '.') and (sr.Name <> '..') then
      begin
        Result := False;
        break;
      end;
    until FindNext(sr) <> 0;
  FindClose(sr);
end;
//------------------------------------------------------------------------------
// è¯»å–文本文件的一种方法
//------------------------------------------------------------------------------
function ReadFile(const sFile:String):String;
var
  sList: TStringlist;
begin
  sList := TStringList.Create;
  try
    if FileExists(sFile) then begin
      sList.LoadFromFile(sFile);
      Result := sList.GetText;
    end;
  finally
    sList.Free;
  end;
end;
//------------------------------------------------------------------------------
// è¯»å–文件:
//1,关联文件:AssignFile(pMyFile,'c:\ttt.csv');
//2,打开文件:Reset(pMyFile);
//3,读取一行:Readln(pMyFile,pStr);
//4,关闭文件:CloseFile(pMyFile);
//------------------------------------------------------------------------------
function ReadLogFile(const sFile:String):String;
var
  pMyFile:textfile;
  pStr : string;
begin
  try
    Assignfile(pMyFile,sFile);
    if FileExists(sFile) then begin
      Reset(pMyFile);
      while not Eof(pMyFile) do begin
        Readln(pMyFile,pStr);
        //next;
      end;
    end;
  finally
    CloseFile(pMyFile);
  end;
  Result := pStr;
end;
//------------------------------------------------------------------------------
// å†™å…¥æ–‡ä»¶ï¼š
//1,关联文件:AssignFile(pMyFile,'c:\ttt.csv');
//2,打开文件:ReWrite(pMyFile);   //如果文件不存在,用ReWrite打开
//             Append(pMyFile);   //如果文件已经存在,追加内容,用Append打开
//3,写入一行:WriteLn(pMyFile,pStr);
//4,关闭文件:CloseFile(pMyFile);
//------------------------------------------------------------------------------
procedure WriteLogFile(const sFile,sMsg: string);
var
  pMyFile: textFile;
begin
  try
    AssignFile(pMyFile,sFile);
    if FileExists(sFile) then
      Append(pMyFile)
    else
      ReWrite(pMyFile);
    WriteLn(pMyFile,sMsg);
  finally
    CloseFile(pMyFile);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: è®¾ç½®è‡ªå¯åЍ
// å‚æ•°:
//   AutoRun     - æ˜¯å¦è‡ªå¯åЍ
//   CurrentUser - æ˜¯å¦åªå¯¹å½“前用户有效
//   AppTitle    - åº”用程序的标题,如 "MSN"
//   AppPara     - è‡ªå¯åŠ¨çš„å‘½ä»¤è¡Œå‚æ•°ï¼Œå¦‚ "/min"
//-----------------------------------------------------------------------------
function SetAutoRunOnStartup(AutoRun, CurrentUser: Boolean;
  AppTitle, AppName, AppPara: string): Boolean;
var
  R: TRegistry;
  Key : string;
begin
  Result := True;
  try
    R := TRegistry.Create;
    try
      if CurrentUser then
        R.RootKey := HKEY_CURRENT_USER
      else
        R.RootKey := HKEY_LOCAL_MACHINE;
      Key := '\Software\Microsoft\Windows\CurrentVersion\Run\';
      if AppTitle = '' then AppTitle := Application.Title;
      if AppName = ''  then AppName := Application.ExeName;
      if AppPara <> '' then AppName := AppName + ' ' + AppPara;
      if R.OpenKey(Key, True) then
      begin
        if AutoRun then
          R.WriteString(AppTitle, AppName)
        else
          R.DeleteValue(AppTitle);
      end;
    finally
      R.Free;
    end;
  except
    Result := False;
  end;
end;
{开机运行。}
procedure AutoRun(Flag: Boolean; title:String);
var
  tempreg: TRegistry;
begin
  tempreg := TRegistry.Create;
  try
    tempreg.RootKey := HKEY_CURRENT_USER;
    tempreg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', True);
    if Flag then
      tempreg.WriteString(title, '"' + ParamStr(0) + '"')
    else begin
      tempreg.DeleteValue(title);
    end;
  finally
    tempreg.Closekey;
    tempreg.Free;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: è¯»æ³¨å†Œè¡¨æŒ‡å®šé”®
// å‚æ•°:
//   CurrentUser - æ˜¯å¦åªå¯¹å½“前用户有效
//   Name        - åº”用程序的标题,如 "MSN"
// è¿”回:Value   - è¿”回Name对应值
//-----------------------------------------------------------------------------
function ReadReg(const Name: String; CurrentUser: Boolean=true):String;
var
  R: TRegistry;
  Key : String;
begin
  Result := '';
  R := TRegistry.Create;
  try
    if CurrentUser then
      R.RootKey := HKEY_CURRENT_USER
    else
      R.RootKey := HKEY_LOCAL_MACHINE;
    Key := '\Software\liliangting\';
    if R.OpenKey(Key,True) then
      Result := R.ReadString(Name);
  finally
    R.Free;
  end;
end;
//写注册表指定值
function WriteReg(const Name,Value: String; CurrentUser: Boolean=true):Boolean;
var
  R: TRegistry;
  Key : String;
begin
  Result := false;
  R := TRegistry.Create;
  try
    if CurrentUser then
      R.RootKey := HKEY_CURRENT_USER
    else
      R.RootKey := HKEY_LOCAL_MACHINE;
    Key := '\Software\liliangting\';
    if R.OpenKey(Key,True) then begin
      R.WriteString(Name, Value);
      Result := true;
    end;
  finally
    R.Free;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: æ–‡ä»¶å…³è”
// å‚æ•°:
//   FileExt      - æ–‡ä»¶æ‰©å±•名
//   FileKey      - è¯¥æ–‡ä»¶ç±»åž‹çš„英文符号
//   SoftName     - è½¯ä»¶çš„名字 (用于显示在资源管理器的右键菜单上)
//   FileDesc     - æ–‡ä»¶ç±»åž‹çš„æè¿°
//   IconIndex    - å›¾æ ‡åºå·(0-based)
//   Flush        - æ˜¯å¦åˆ·æ–°Windows缓冲
// ç¤ºä¾‹:
//   AssociateFile('.edf', 'EDiaryFile', 'EDiary', '电子日记本文件');
//-----------------------------------------------------------------------------
function AssociateFile(const FileExt, FileKey, SoftName, FileDesc: string;
  IconIndex: Integer; Flush: Boolean): Boolean;
var
  R: TRegistry;
begin
  Result := True;
  try  // Win2000下受限用户执行此操作将会报错
    R := TRegistry.Create;
    try
      R.RootKey := HKEY_CLASSES_ROOT;
      R.OpenKey('\' + FileExt, True);
      R.WriteString('', FileKey);
      R.OpenKey('\' + FileKey, True);
      R.WriteString('', FileDesc);
      R.OpenKey('\' + FileKey + '\Shell\Open\Command', True);
      R.WriteString('', Application.ExeName + ' "%1"');
      R.OpenKey('\' + FileKey + '\Shell\Open with ' + SoftName + '\Command', True);
      R.WriteString('', Application.ExeName + ' "%1"');
      R.OpenKey('\' + FileKey + '\DefaultIcon', True);
      R.WriteString('', Application.ExeName + ',' + IntToStr(IconIndex));
    finally
      R.Free;
    end;
    if Flush then SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  except
    Result := False;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: åœ¨æ³¨å†Œè¡¨ä¸­è®°ä¸‹ç¨‹åºè·¯å¾„
//-----------------------------------------------------------------------------
function SaveAppPath(const CompanyName, SoftName, Version: string): Boolean;
const
  SPathKey = 'Path';
var
  R: TRegistry;
  Key: string;
begin
  Result := True;
  try
    R := TRegistry.Create;
    try
      R.RootKey := HKEY_CURRENT_USER;
      Key := '\Software\' + CompanyName + '\' + SoftName + '\' + Version + '\';
      if R.OpenKey(Key, True) then
        R.WriteString(SPathKey, GetModulePath);
    finally
      R.Free;
    end;
  except
    Result := False;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: ä»Žæ³¨å†Œè¡¨ä¸­è¯»å–程序路径
//-----------------------------------------------------------------------------
function ReadAppPath(const CompanyName, SoftName, Version: string; var Path: string): Boolean;
const
  SPathKey = 'Path';
var
  R: TRegistry;
  Key: string;
begin
  try
    R := TRegistry.Create;
    try
      R.RootKey := HKEY_CURRENT_USER;
      Key := '\Software\' + CompanyName + '\' + SoftName + '\' + Version + '\';
      Result := R.OpenKey(Key, False);
      if Result then
        Path := R.ReadString(SPathKey);
    finally
      R.Free;
    end;
  except
    Result := False;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: FileTime -> LocalSystemTime
//-----------------------------------------------------------------------------
function FileTimeToLocalSystemTime(FTime: TFileTime): TSystemTime;
var
  STime: TSystemTime;
begin
  FileTimeToLocalFileTime(FTime, FTime);
  FileTimeToSystemTime(FTime, STime);
  Result := STime;
end;
//-----------------------------------------------------------------------------
// æè¿°: LocalSystemTime -> FileTime
//-----------------------------------------------------------------------------
function LocalSystemTimeToFileTime(STime: TSystemTime): TFileTime;
var
  FTime: TFileTime;
begin
  SystemTimeToFileTime(STime, FTime);
  LocalFileTimeToFileTime(FTime, FTime);
  Result := FTime;
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回 TDateTime ä¸­çš„æ—¥æœŸéƒ¨åˆ†
//-----------------------------------------------------------------------------
function GetDatePart(DateTime: TDateTime): TDate;
begin
  Result := Trunc(DateTime);
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回 TDateTime ä¸­çš„æ—¶é—´éƒ¨åˆ†
//-----------------------------------------------------------------------------
function GetTimePart(DateTime: TDateTime): TTime;
begin
  Result := DateTime - Trunc(DateTime);
end;
//-----------------------------------------------------------------------------
//获取CPUID并输出字符串
//-----------------------------------------------------------------------------
function GetCPUID: TCPUID; assembler; register;
asm
  PUSH EBX {Save affected register}
  PUSH EDI
  MOV EDI,EAX {@Resukt}
  MOV EAX,1
  DW $A20F {CPUID Command}
  STOSD {CPUID[1]}
  MOV EAX,EBX
  STOSD {CPUID[2]}
  MOV EAX,ECX
  STOSD {CPUID[3]}
  MOV EAX,EDX
  STOSD {CPUID[4]}
  POP EDI {Restore registers}
  POP EBX
end;
//输出函数: èŽ·å–CPUID并输出字符串
function GetCPUIDStr:String;
var
  CPUID:TCPUID;
begin
  CPUID:=GetCPUID;
  Result:=IntToStr(CPUID[1])+IntToStr(CPUID[2])+IntToStr(CPUID[3])+IntToStr(CPUID[4]);
end;
//获取网卡MAC地址部分
//调用系统函数获取当前可用的mac
function GetMacAddress: string;
var
  Lib: Cardinal;
  Func: function(GUID: PGUID): Longint; stdcall;
  GUID1, GUID2: TGUID;
begin
  Result := '000000000000';
  Lib := LoadLibrary('rpcrt4.dll');
  if Lib <> 0 then
  begin
    if Win32Platform <>VER_PLATFORM_WIN32_NT then
      @Func := GetProcAddress(Lib, 'UuidCreate')
      else @Func := GetProcAddress(Lib, 'UuidCreateSequential');
    if Assigned(Func) then
    begin
      if (Func(@GUID1) = 0) and
        (Func(@GUID2) = 0) and
        (GUID1.D4[2] = GUID2.D4[2]) and
        (GUID1.D4[3] = GUID2.D4[3]) and
        (GUID1.D4[4] = GUID2.D4[4]) and
        (GUID1.D4[5] = GUID2.D4[5]) and
        (GUID1.D4[6] = GUID2.D4[6]) and
        (GUID1.D4[7] = GUID2.D4[7]) then
      begin
        Result :=IntToHex(GUID1.D4[2], 2) + IntToHex(GUID1.D4[3], 2) +
                 IntToHex(GUID1.D4[4], 2) + IntToHex(GUID1.D4[5], 2) +
                 IntToHex(GUID1.D4[6], 2) + IntToHex(GUID1.D4[7], 2);
      end;
    end;
    FreeLibrary(Lib);
  end;
end;
//获取实时内存使用量
function GetMemUse: Cardinal;
  function GetProcessMemUse(PID: Cardinal): Cardinal;
  var
    pmc: pprocess_memory_counters;//uses psApi
    ProcHandle: HWND;
    iSize: DWORD;
  begin
    Result := 0;
    iSize := SizeOf(_PROCESS_MEMORY_COUNTERS);
    GetMem(pmc, iSize);
    try
      pmc^.cb := iSize;
      ProcHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
      if GetProcessMemoryInfo(ProcHandle, pmc, iSize) then
        Result := pmc^.WorkingSetSize;
    finally
      FreeMem(pmc);
    end;
  end;
begin
  Result := GetProcessMemUse(GetCurrentProcessId);
end;
//-----------------------------------------------------------------------------
// æè¿°: å¼€å§‹ç­‰å¾…
//-----------------------------------------------------------------------------
procedure BeginWait;
begin
  Screen.Cursor := crHourGlass;
end;
//-----------------------------------------------------------------------------
// æè¿°: åœæ­¢ç­‰å¾…
//-----------------------------------------------------------------------------
procedure EndWait;
begin
  Screen.Cursor := crDefault;
end;
//-----------------------------------------------------------------------------
// æè¿°: ç›¸å½“于C语言中的 exp ? v1 : v2
//-----------------------------------------------------------------------------
function Iif(Value: Boolean; Value1, Value2: Variant): Variant;
begin
  if Value then Result := Value1
  else Result := Value2;
end;
//-----------------------------------------------------------------------------
// æè¿°: å– V1, V2 ä¸­çš„æœ€å°å€¼
//-----------------------------------------------------------------------------
function Min(V1, V2: Integer): Integer;
begin
  if V1 > V2 then Result := V2
  else Result := V1;
end;
//-----------------------------------------------------------------------------
// æè¿°: å– V1, V2 ä¸­çš„æœ€å¤§å€¼
//-----------------------------------------------------------------------------
function Max(V1, V2: Integer): Integer;
begin
  if V1 > V2 then Result := V1
  else Result := V2;
end;
//-----------------------------------------------------------------------------
// æè¿°: è°ƒæ•´ Value,使 (Value >= Min) and (Value <= Max)
//-----------------------------------------------------------------------------
function TrimValue(Value, Min, Max: Integer): Integer;
begin
  if Value < Min then Value := Min;
  if Value > Max then Value := Max;
  Result := Value;
end;
//-----------------------------------------------------------------------------
// æè¿°: äº¤æ¢ V1, V2
//-----------------------------------------------------------------------------
procedure Swap(var V1, V2: Integer);
var
  Temp: Integer;
begin
  Temp := V1;
  V1 := V2;
  V2 := Temp;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得两个 Ticks ä¹‹å·®
//-----------------------------------------------------------------------------
function GetTickDiff(const OldTickCount, NewTickCount: Cardinal): Cardinal;
begin
  if NewTickCount >= OldTickCount then
  begin
    Result := NewTickCount - OldTickCount;
  end else
  begin
    Result := High(Cardinal) - OldTickCount + NewTickCount;
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: é™åˆ¶çŸ©å½¢åŒºåŸŸä¸è¦è¶…出屏幕范围
// å‚æ•°:
//   Rect       - å¾…调整的矩形区域
//   AllVisible - çŸ©å½¢åŒºåŸŸæ˜¯ä¸æ˜¯è¦å…¨éƒ¨å¯è§
// è¿”回:
//   è°ƒæ•´åŽçš„矩形区域 (宽、高不变)
//-----------------------------------------------------------------------------
function RestrictRectInScr(Rect: TRect; AllVisible: Boolean): TRect;
const
  Space = 100;
var
  ScrRect: TRect;
  W, H: Integer;
begin
  ScrRect := Screen.WorkAreaRect;
  W := Rect.Right - Rect.Left;
  H := Rect.Bottom - Rect.Top;
  if AllVisible then
  begin
    if W > (ScrRect.Right - ScrRect.Left) then W := (ScrRect.Right - ScrRect.Left);
    if H > (ScrRect.Bottom - ScrRect.Top) then H := (ScrRect.Bottom - ScrRect.Top);
    if Rect.Right > ScrRect.Right then
      Rect.Left := ScrRect.Right - W;
    if Rect.Bottom > ScrRect.Bottom then Rect.Top := ScrRect.Bottom - H;
    if Rect.Left < ScrRect.Left then Rect.Left := ScrRect.Left;
    if Rect.Top < ScrRect.Top then Rect.Top := ScrRect.Top;
    Rect.Right := Rect.Left + W;
    Rect.Bottom := Rect.Top + H;
  end else
  begin
    if Rect.Left >= ScrRect.Right - Space then
      Rect.Left := ScrRect.Right - Space;
    if Rect.Top >= ScrRect.Bottom - Space then
      Rect.Top := ScrRect.Bottom - Space;
    if Rect.Right <= ScrRect.Left + Space then
      Rect.Left := ScrRect.Left - (Rect.Right - Rect.Left) + Space;
    if Rect.Top < ScrRect.Top then
      Rect.Top := ScrRect.Top;
    Rect.Right := Rect.Left + W;
    Rect.Bottom := Rect.Top + H;
  end;
  Result := Rect;
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得自身 DLL或OCX或EXE æ‰€åœ¨çš„路径
// æ³¨æ„: ç”¨ Application.ExeName æ— æ³•取得 ActiveX çš„路径。
//-----------------------------------------------------------------------------
function GetModulePath: string;
var
  S: array[0..MAX_PATH] of Char;
begin
  GetModuleFileName(HInstance, S, MAX_PATH);
  Result := PathWithSlash(ExtractFilePath(S));
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得自身 DLL或OCX或EXE æ‰€åœ¨è·¯å¾„的子目录路径
//-----------------------------------------------------------------------------
function GetModuleSubPath(const SubFolder: string = ''): string;
begin
  Result := GetModulePath + SubFolder;
  Result := PathWithSlash(Result);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得自身 EXE æ‰€åœ¨è·¯å¾„
//-----------------------------------------------------------------------------
function GetAppPath: string;
begin
  Result := ExtractFilePath(Application.ExeName);
end;
//-----------------------------------------------------------------------------
// æè¿°: å–得自身 EXE æ‰€åœ¨è·¯å¾„的子目录路径
//-----------------------------------------------------------------------------
function GetAppSubPath(const SubFolder: string): string;
begin
  Result := GetAppPath + SubFolder;
  Result := PathWithSlash(Result);
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回矩形 R çš„宽度
//-----------------------------------------------------------------------------
function GetRectWidth(const R: TRect): Integer;
begin
  Result := R.Right - R.Left;
end;
//-----------------------------------------------------------------------------
// æè¿°: è¿”回矩形 R çš„高度
//-----------------------------------------------------------------------------
function GetRectHeight(const R: TRect): Integer;
begin
  Result := R.Bottom - R.Top;
end;
//-----------------------------------------------------------------------------
// æè¿°: ç»˜åˆ¶æœ‰è¾¹æ¡†çš„æ–‡å­—
//-----------------------------------------------------------------------------
procedure DrawStrokedText(Canvas: TCanvas; X, Y: Integer; const Text: string;
  FontColor, StrokedColor, SmoothColor: TColor);
var
  SaveStyle: TBrushStyle;
  SaveFontColor: TColor;
begin
  SaveStyle := Canvas.Brush.Style;
  SaveFontColor := Canvas.Font.Color;
  try
    Canvas.Brush.Style := bsClear;
    Canvas.Font.Color := SmoothColor;
    Canvas.TextOut(X - 1, Y - 1, Text);
    Canvas.TextOut(X - 1, Y + 1, Text);
    Canvas.TextOut(X + 1, Y - 1, Text);
    Canvas.TextOut(X + 1, Y + 1, Text);
    Canvas.Font.Color := StrokedColor;
    Canvas.TextOut(X, Y - 1, Text);
    Canvas.TextOut(X, Y + 1, Text);
    Canvas.TextOut(X + 1, Y, Text);
    Canvas.TextOut(X - 1, Y, Text);
    Canvas.Font.Color := FontColor;
    Canvas.TextOut(X, Y, Text);
  finally
    Canvas.Font.Color := SaveFontColor;
    Canvas.Brush.Style := SaveStyle;
  end;
end;
//------------------------------------------------------------------------------
//返回屏幕分辨率宽度
//------------------------------------------------------------------------------
function GetScreenWidth:Integer;
var
  sysinfo: TSystemInfo;
begin
  GetSystemInfo(sysinfo);
  Result:= GetSystemMetrics(SM_CXSCREEN);   //分辨率宽
  //y:= GetSystemMetrics(SM_CYSCREEN);   //分辨率高
end;
//返回屏幕分辨率高度
function GetScreenHeight:Integer;
var
  sysinfo: TSystemInfo;
begin
  GetSystemInfo(sysinfo);
  //x:= GetSystemMetrics(SM_CXSCREEN);   //分辨率宽
  Result:= GetSystemMetrics(SM_CYSCREEN);   //分辨率高
end;
//------------------------------------------------------------------------------
//返回桌面高度和宽度
//------------------------------------------------------------------------------
function GetDesktopWidth:Integer;
var
  hRect : TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA,0,@hRect, 0);
  Result:= hRect.Right; //返回宽度
end;
function GetDesktopHeight:Integer;
var
  hRect : TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA,0,@hRect, 0);
  Result:= hRect.Bottom; //返回宽度
end;
//-----------------------------------------------------------------------------
// æè¿°: åˆ¤æ–­å­—符串是否为任意长度带整数
//-----------------------------------------------------------------------------
function IsBigInt(const S:String): Boolean; //变量S为要判断的字符串,返回true则正确
var
  i : integer;
begin
  Result:=True;
  for i :=1 to length(s) do
     if not (s[i] in ['0'..'9']) then   //判断字符串每个字符即s[i],是否为"0"到'9"数字
       Result:=False;
end;
//------------------------------------------------------------------------------
//2011-10-26 æ–°å¢žComboBox_XPMan_KeyPress函数,解决ComboBox控件输入乱码问题,
//           åœ¨KeyPress事件中执行ComboBox_XPMan_KeyPress即可解决。
//------------------------------------------------------------------------------
Function IsNTSystem:Boolean;
var
  info:OSVERSIONINFO;
begin
  info.dwOSVersionInfoSize:=sizeof(info);
  GetVersionEx(info);
  Result:=info.dwPlatformId=VER_PLATFORM_WIN32_NT;
end;
procedure ComboBox_XPMan_KeyPress(Sender:TObject;var Key: Char);
  {子函数,处理消息}
  function HasSelectedText(CB_HWND:HWND; var StartPos, EndPos: DWORD): Boolean;
  begin
    SendMessage(CB_HWND, CB_GETEDITSEL, Integer(@StartPos),
    Integer(@EndPos));
    Result := EndPos > StartPos;
  end;
var
  StartPos, EndPos: DWORD;
  OldText, SaveText: WideString; //关键在此,中间字符串要设为宽字符串型
  LastByte: Integer;
  TheCB:TComboBox;
  CBHandle:HWND;
begin
  if not IsNTSystem then Exit; //非NT系统则退出
  TheCB:=TComboBox(Sender);
  CBHandle:=TheCB.Handle;
  if not TheCB.AutoComplete then exit;
  if ord(Key) = VK_BACK then
  begin
    SaveText := TheCB.Text;
    if HasSelectedText(CBHandle, StartPos, EndPos) then
    begin
      SendMessage(CBHandle,CB_GETEDITSEL,Integer(@StartPos),Integer(@EndPos));
      Delete(SaveText, StartPos + 1, EndPos - StartPos);
      SendMessage(CBHandle, CB_SETCURSEL, -1, 0);
      TheCB.Text := SaveText;
      SendMessage(CBHandle,CB_SETEDITSEL,0,MakeLParam(StartPos,StartPos));
      Key := #0;
    end
    else if(TheCB.Style in [csDropDown,csSimple]) and (Length(SaveText)>0) then
    begin
      LastByte := StartPos;
      OldText := Copy(SaveText, 1, LastByte - 1);
      SendMessage(CBHandle, CB_SETCURSEL, -1, 0);
      TheCB.Text := OldText + Copy(SaveText, EndPos + 1, MaxInt);
      SendMessage(CBHandle, CB_SETEDITSEL, 0, MakeLParam(LastByte - 1,LastByte - 1));
      Key := #0;
    end;
  end;
end;
//--------------------------------------------------
// å‡½æ•°: æ ¼å¼åŒ–æ•°å­—, æŒ‰æŒ‡å®šä½æ•°æ‰©å±•æ•°å­—,转换字符串
// å…¥å‚: å¾…格式化的数字,扩展位数
// è¿”回: è½¬æ¢çš„字符串
// ä¾‹å¦‚: formatNum(12,4) = '0012'
//--------------------------------------------------
Function formatNum(Number, Length: Integer): string;
var
  i : Integer;
  s1: string;
begin
  s1:='';
  for i:=0 to Length-1 do
    s1:=s1+'0';
  Result:=RightStr(s1+IntToStr(Number), Length);
end;
//------------------------------------------------------------------------------
// å‡½æ•°ï¼šæ ¼å¼åŒ–字符串,加单引号
// å…¥å‚:待格式化的字符串
// è¿”回:转换的字符串
// ä¾‹å¦‚:Q('abc') = ''abc''
//------------------------------------------------------------------------------
Function Q(s1:string):string;
begin
  Result:=Quotedstr(s1);
end;
//无刷新延时函数
procedure Delay(MSecs: Longint);
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := GetTickCount();
  repeat
    Application.ProcessMessages;
    Now := GetTickCount();
  until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;
//------------------------------------------------------------------------------
// å‡½æ•°: è‡ªå®šä¹‰çº¸å¼ æ‰“印函数
// ä»¥ä¸‹ç¨‹åºå°†æ‰“印机纸张设为:114mm*190mm:
// Uses Printers;
//------------------------------------------------------------------------------
procedure PreparePrinter(Width,Height:Integer);
var
  aDevice: array[0..CCHDEVICENAME-1] of Char;
  aDriver: array[0..MAX_PATH-1] of Char;
  aPort:   array[0..31] of Char;
  hDevMode: THandle;
  pDevMode: PDeviceMode;
begin
  //获取打印机DeviceMode的句柄
  Printer.GetPrinter(aDevice, aDriver, aPort, hDevMode);
  if hDevMode <> 0 then
  begin
    //获取指向DeviceMode的指针
    pDevMode:=GlobalLock(hDevMode);
    if pDevMode <> nil then
    begin
      pDevMode^.dmPaperSize:= DMPAPER_USER; //自定义纸张:256
      pDevMode^.dmPaperLength:=Width*10;
      pDevMode^.dmPaperWidth:= Height*10;
      pDevMode^.dmFields:=pDevMode^.dmFields or DM_PAPERSIZE;//以下三句是对应dmFields成员置位
      pDevMode^.dmFields:=pDevMode^.dmFields or DM_PAPERLENGTH;
      pDevMode^.dmFields:=pDevMode^.dmFields or DM_PAPERWIDTH;
      ResetDC(Printer.Handle, pDevMode^);  //设置打印机设备句柄
      GlobalUnlock(hDevMode);
    end;
  end;
end;
//------------------------------------------------------------------------------
// æè¿°ï¼šç¨‹åºç¬¦åˆè¦æ±‚时自动销毁主程序
//------------------------------------------------------------------------------
procedure DeleteMe;
var
  BatchFile: TextFile;
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';
  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);
  Writeln(BatchFile, ':try');
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,
    'if exist "' + ParamStr(0) + '"' + ' goto try');
  Writeln(BatchFile, 'del %0');
  CloseFile(BatchFile);
  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;
//------------------------------------------------------------------------------
// åœ¨ç³»ç»Ÿè¿è¡Œæ—¶è‡ªåŠ¨æ”¹å˜ç³»ç»Ÿçš„æ—¥æœŸæ ¼å¼
// å…¥å‚: æ—¥æœŸæ ¼å¼,如 yyyy-MM-dd
//------------------------------------------------------------------------------
procedure SetSystemDateFormat(sFormat:string='yyyy-MM-dd');
begin
  SetLocaleInfo(LOCALE_SLONGDATE,LOCALE_SDATE,'- ');
  SetLocaleInfo(LOCALE_SLONGDATE,LOCALE_SSHORTDATE, PChar(sFormat));
  SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
end;
//-----------------------------------------------------------------------------
// æè¿°: å¯¹å­—符串进行 base16 ç¼–码
// å‚æ•°:
//   Value - å¾…编码的字符串
// è¿”回:
//   ç¼–码后的字符串
//-----------------------------------------------------------------------------
function Base16Encode(const Src: AnsiString): AnsiString;
const
  H: array[0..15] of AnsiChar = '0123456789ABCDEF';
var
  S: PByte;
  D: PAnsiChar;
  SrcBytes: Integer;
begin
  Result := '';
  SrcBytes := Length(Src);
  SetLength(Result, SrcBytes * 2);
  if SrcBytes = 0 then Exit;
  D := PAnsiChar(Result);
  S := PByte(Src);
  while SrcBytes > 0 do
  begin
    D^ := H[S^ shr  4]; Inc(D);
    D^ := H[S^ and $F]; Inc(D);
    Inc(S);
    Dec(SrcBytes);
  end;
end;
//-----------------------------------------------------------------------------
// æè¿°: å°† base16 ç¼–码的内容还原成字符串
// å‚æ•°:
//   Value - å¾…解码的字符串
// è¿”回:
//   è§£ç åŽçš„字符串
//-----------------------------------------------------------------------------
function Base16Decode(const Src: AnsiString): AnsiString;
var
  D: PByte;
  V: Byte;
  S: PAnsiChar;
  SrcBytes: Integer;
begin
  Result := '';
  SrcBytes := Length(Src);
  SetLength(Result, (SrcBytes +1) div 2);
  D := PByte(Result);
  S := PAnsiChar(Src);
  while SrcBytes > 0 do
  begin
    V := Byte(UpCase(S^));
    Inc(S);
    if V > Byte('9') then D^ := V - Byte('A') + 10
      else D^ := V - Byte('0');
    V := Byte(UpCase(S^));
    Inc(S);
    D^ := D^ shl 4;
    if V > Byte('9') then D^ := D^ or (V - Byte('A') + 10)
      else D^ := D^ or (V - Byte('0'));
    Dec(SrcBytes, 2);
    Inc(D);
  end;
  SetLength(Result, PAnsiChar(D) - PAnsiChar(Result));
end;
//------------------------------------------------------------------------------
//一个通过ActiveX获取GUID的函数
//返回值:GUID字符串
//------------------------------------------------------------------------------
Function GetGUID:string;
var
  sGUID  : string;
  TmpGUID: TGUID;
begin
  if CoCreateGUID(TmpGUID) = S_OK then
    sGUID := GUIDToString(TmpGUID)
  else
    sGUID := '0';
  Result:=sGUID;
end;
//------------------------------------------------------------------------------
//延时函数,MSecs单位为毫秒(千分之1秒)
//输入值:毫秒,延时时间
//------------------------------------------------------------------------------
procedure Delay1(MSecs: Longint);
var
  First: Longint;
begin
  for First:=1 to 10 do
  begin
    Sleep(Trunc(Msecs/10));
    //Application.ProcessMessages;
  end;
end;
procedure Delay2(MSecs: Longint);
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := GetTickCount();
  repeat
    Application.ProcessMessages;
    Now := GetTickCount();
  until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;
//------------------------------------------------------------------------------
//获取软件版权信息
//输入值:应用程序名
//返回值:初始化全局变量glxxx , åŒ…括产品名称,产品版本,文件描述,版权,文件版本,
//        å…¬å¸åç§°ï¼Œæ³¨å†Œå•†æ ‡ï¼Œå¤–部名称,原始名称等
//------------------------------------------------------------------------------
procedure GetVersionInfo(AppExeName:string);
var
   BufSize, Len:DWORD;
   Buf, Value:PChar;
begin
   BufSize:=GetFileVersionInfoSize(PChar(AppExeName), BufSize);
   if BufSize>0 then
   begin
       Buf:=AllocMem(BufSize);
       GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, Buf);
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[1]),Pointer(Value),Len) then
           glProductName:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[2]),Pointer(Value),Len) then
           glProductVersion:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[3]),Pointer(Value),Len) then
           glFileDescription:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[4]),Pointer(Value),Len) then
           glLegalCopyright:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[5]),Pointer(Value),Len) then
           glFileVersion:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[6]),Pointer(Value),Len) then
           glCompanyName:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[7]),Pointer(Value),Len) then
           glLegalTrademarks:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[8]),Pointer(Value),Len) then
           glInternalName:=Value;
       if VerQueryValue(Buf,PChar('StringFileInfo\080403A8\'+glVerInfo[9]),Pointer(Value),Len) then
           glOriginalFilename:=Value;
       FreeMem(Buf,BufSize);
   end;
end;
//------------------------------------------------------------------------------
// æžšä¸¾ç³»ç»ŸCOM口,加到COM列表
// è¾“入值:端口列表
// è¿”回值:nil
//------------------------------------------------------------------------------
procedure EnumComPorts(Ports: TStrings);
var
  KeyHandle: HKEY;
  ErrCode, Index: Integer;
  ValueName, Data: string;
  ValueLen, DataLen, ValueType: DWORD;
  TmpPorts: TStringList;
begin
  ErrCode := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM', 0,
                          KEY_READ, KeyHandle);
  if ErrCode <> ERROR_SUCCESS then
    Exit;  // raise EComPort.Create(CError_RegError, ErrCode);
  TmpPorts := TStringList.Create;
  try
    Index := 0;
    repeat
      ValueLen := 256;
      DataLen := 256;
      SetLength(ValueName, ValueLen);
      SetLength(Data, DataLen);
      ErrCode := RegEnumValue(KeyHandle, Index, PChar(ValueName), Cardinal(ValueLen),
                              nil, @ValueType, PByte(PChar(Data)), @DataLen);
      if ErrCode = ERROR_SUCCESS then
      begin
        SetLength(Data, DataLen);
        TmpPorts.Add(Data);
        Inc(Index);
      end
      else
        if ErrCode <> ERROR_NO_MORE_ITEMS then
          exit; //raise EComPort.Create(CError_RegError, ErrCode);
    until (ErrCode <> ERROR_SUCCESS) ;
    TmpPorts.Sort;
    Ports.Assign(TmpPorts);
  finally
    RegCloseKey(KeyHandle);
    TmpPorts.Free;
  end;
end;
function CheckComPort(ComPortName: string; var ComPortList: Tstrings): boolean;
var
  reg: TRegistry; //uses å•元文件Registry
  ts: TStrings;   //键名
  i: Integer;
  tl: TStringList; //串口名称
  nIndex: Integer;
begin
  reg := TRegistry.Create;
  ts := TStringList.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKey('hardware\devicemap\serialcomm', False);
    reg.GetValueNames(ts); //获取注册表中串口的 é”®å
    tl := TStringList.Create;
    for i := 0 to ts.Count - 1 do
    begin
      tl.Add(reg.ReadString(ts.Strings[i])); //根据键名,读取注册表中对应的串口名称(例如COM1)
    end;
    tl.Sort;
    ComPortList := tl;
    Result := tl.Find(ComPortName, nIndex);//查询是否存在
    //ShowMessage(IntToStr((nIndex)));
  finally
   // tl.Free;
    ts.Free;
    reg.CloseKey;
    reg.Free;
  end;
end;
//------------------------------------------------------------------------------
// å­—符串转换成16进制字符串
// è¾“入值:ASCII字符串
// è¿”回值:ASCII转成16进制数,并用string显示
//------------------------------------------------------------------------------
function StrToHexStr(const S:string):string;
var
  I:Integer;
begin
  for I:=1 to Length(S) do
  begin
    if I=1 then
      Result:=IntToHex(Ord(S[1]),2)
    else
      Result:=Result+' '+IntToHex(Ord(S[I]),2);
  end;
end;
//字符串转换成十六进制字符串,中间无空格!!!
function StrToHexStr1(const S:string):string;
var
  I:Integer;
  ss:String;
begin
  for I:=1 to Length(S) do
    ss:=ss+IntToHex(Integer(S[I]),2);
  Result:=ss;
end;
//------------------------------------------------------------------------------
// 16进制字符串转换成字符串
// è¾“入值:待转换的16进制字符串
// è¿”回值:ASCII字符串
//------------------------------------------------------------------------------
function HexStrToStr(const S:string; bFlag:boolean=false):string;
var
  t:Integer;
  ts, SS:string;
  M,Code:Integer;
begin
  t:=1;
  Result:='';
  //处理字符串 '00'-->'20' (即将null转为空格,防止行解析终止)
  if bFlag then
    SS := StringReplace(S, '00', '20', [rfReplaceAll, rfIgnoreCase])
  else
    SS := S ;
  while t<=Length(SS) do
  begin
    while (t<=Length(SS)) and (not (SS[t] in ['0'..'9','A'..'F','a'..'f'])) do
      inc(t);
    if (t+1>Length(SS))or(not (SS[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
      ts:='$'+SS[t]
    else
      ts:='$'+SS[t]+SS[t+1];
    Val(ts,M,Code);
    if Code=0 then
      Result:=Result+Chr(M);
    inc(t,2);
  end;
end;
//------------------------------------------------------------------------------
// ä»¥åå…­è¿›åˆ¶æ–¹å¼æŸ¥çœ‹å†…存的函数
// è¾“入值:任意类型值、值的长度
// è¿”回值:16进制ASCII,并用string显示
//------------------------------------------------------------------------------
function GetMemBytes(var X; size: Integer): string;
var
  pb: PByte;
  i: Integer;
begin
  pb := PByte(X);
  for i := 0 to size - 1 do
  begin
    Result := Result + IntToHex(pb^, 2) + #32;
    Inc(pb);
  end;
end;
//------------------------------------------------------------------------------
// éåŽ†ç›®å½•å’Œå­ç›®å½•ä¸‹çš„æ–‡ä»¶åï¼ˆå¯æŒ‰åŽç¼€åéåŽ†ï¼‰
// è¾“入值:FilePath-路径如'C:\DIR',ExtMask-文件后缀如'*.*',FileList-字符串列表
//         SubDir-是否遍历子目录
// è¿”回值:无,直接访问fileList字符串列表
// åŒ…含文件:Contnrs ï¼ˆTQueue类使用)
// eg:GetFileListEx(dir, '*.tst', clbSodimFile.Items, False);
//------------------------------------------------------------------------------
procedure GetFileListEx(FilePath, ExtMask: string; FileList: TStrings; SubDir: Boolean = True);
  function Match(FileName: string; MaskList: TStrings): Boolean;
  var
    i: integer;
  begin
    Result := False;
    for i := 0 to MaskList.Count - 1 do
    begin
      if MatchesMask(FileName, MaskList[i]) then
      begin
        Result := True;
        break;
      end;
    end;
  end;
var
  FileRec: TSearchRec;
  MaskList: TStringList;
begin
  if DirectoryExists(FilePath) then
  begin
    if FilePath[Length(FilePath)] <> '\' then
      FilePath := FilePath + '\';
    if FindFirst(FilePath + '*.*', faAnyFile, FileRec) = 0 then
    begin
      MaskList := TStringList.Create;
      try
        ExtractStrings([';'], [], PChar(ExtMask), MaskList);
        FileList.BeginUpdate;
        repeat
          if ((FileRec.Attr and faDirectory) <> 0) and SubDir then
          begin
            if (FileRec.Name <> '.') and (FileRec.Name <> '..') then
              GetFileListEx(FilePath + FileRec.Name + '\', ExtMask, FileList);
          end
          else
          begin
            if Match(FilePath + FileRec.Name, MaskList) then
             //这里如果只返回文件名,则注释掉路径即可
             // FileList.Add( { FilePath + } FileRec.Name);
             FileList.Add( FilePath + FileRec.Name);
          end;
        until FindNext(FileRec) <> 0;
        FileList.EndUpdate;
      finally
        MaskList.Free;
      end;
    end;
    FindClose(FileRec);
  end;
end;
//返回不带路径的文件集合
procedure GetFileList(FilePath, ExtMask: string; FileList: TStrings; SubDir: Boolean = True);
  function Match(FileName: string; MaskList: TStrings): Boolean;
  var
    i: integer;
  begin
    Result := False;
    for i := 0 to MaskList.Count - 1 do
    begin
      if MatchesMask(FileName, MaskList[i]) then
      begin
        Result := True;
        break;
      end;
    end;
  end;
var
  FileRec: TSearchRec;
  MaskList: TStringList;
begin
  if DirectoryExists(FilePath) then
  begin
    if FilePath[Length(FilePath)] <> '\' then
      FilePath := FilePath + '\';
    if FindFirst(FilePath + '*.*', faAnyFile, FileRec) = 0 then
    begin
      MaskList := TStringList.Create;
      try
        ExtractStrings([';'], [], PChar(ExtMask), MaskList);
        FileList.BeginUpdate;
        repeat
          if ((FileRec.Attr and faDirectory) <> 0) and SubDir then
          begin
            if (FileRec.Name <> '.') and (FileRec.Name <> '..') then
              GetFileListEx(FilePath + FileRec.Name + '\', ExtMask, FileList);
          end
          else
          begin
            if Match(FilePath + FileRec.Name, MaskList) then
             //这里如果只返回文件名,则注释掉路径即可
              FileList.Add( { FilePath + } FileRec.Name);
             //FileList.Add( FilePath + FileRec.Name);
          end;
        until FindNext(FileRec) <> 0;
        FileList.EndUpdate;
      finally
        MaskList.Free;
      end;
    end;
    FindClose(FileRec);
  end;
end;
//------------------------------------------------------------------------------
// åˆ é™¤æ•´ä¸ªç›®å½•下的文件,包括目录
// è¾“入值:Path-路径如'C:\DIR',IsDelDir-是否删除目录
// è¿”回值:True-操作成功
// eg:DeleteDirectory(dir, True);
//------------------------------------------------------------------------------
function DeleteDir(Path: string;IsDelDir: Boolean = False): Boolean;
var
  search: TSearchRec;
  ret: integer;
  key: string;
begin
  if Path[Length(Path)] <> '\' then
    Path := Path + '\';
  key := Path + '*.*';
  ret := findFirst(key, faanyfile, search);
  while ret = 0 do
  begin
    if ((search.Attr and fadirectory) = fadirectory) then
    begin
      if (search.Name <> '.') and (search.name <> '..') then
        DeleteDirectory(Path + search.name);
    end
    else
    begin
      if ((search.Attr and fadirectory) <> fadirectory) then
      begin
        deletefile(Path + search.name);
      end;
    end;
    ret := FindNext(search);
  end;
  findClose(search);
  if IsDelDir then  //如果需要删除文件夹则添加
    removedir(Path);
  result := True;
end;
//------------------------------------------------------------------------------
// æ“ä½œExcel的相关函数
// èŽ·å–Excel版本,返回值:版本号11-2003,12-2007
{const
  Wordversion97 = 8;
  Wordversion2000 = 9;
  WordversionXP = 10;
  Wordversion2003 = 11;
  Wordversion2007 = 12;}
//------------------------------------------------------------------------------
function GetInstalledWordVersion: Integer;
var
  Excel: OLEVariant;
begin
  try
    Excel:=CreateOLEObject('Excel.Application');
  except
    on E: Exception do
      showmessage('获取Excle版本时发生错误!' + #13#10
                + '异常类名称:' + E.ClassName + #13#10
                + '异常信息:' + E.Message);
  end;
  result := Excel.version;
  Excel.Quit;
  FreeAndNil(Excel);
end;
//------------------------------------------------------------------------------
// ç”Ÿæˆéšæœºæ•°
//------------------------------------------------------------------------------
function RandomNum:String;
begin   //生成随机数
  Result := FormatDateTime('yyyymmddhhnnss',Now) + IntToStr(Random(10))+IntToStr(Random(10))+IntToStr(Random(10))+IntToStr(Random(10));
end;
//------------------------------------------------------------------------------
// TStringlist自定义排序参数
// åº”用范例:
{ sl := TStringList.Create;
  try
    sl.DelimitedText:='12,9.123,0.5,30'; //初始化排序sl
    sl.Sorted:=false;                    //自定义排序
    sl.CustomSort(SortParam);            //按自定义排序参数重新排序
    showmessage(sl.Text);                //打印排序后的结果
    showmessage(sl.Strings[0]);          //打印最小值
    showmessage(sl.Strings[sl.Count-1]); //打印最大值
  finally
    FreeAndNil(sl);
  end;
}
//------------------------------------------------------------------------------
function SortParam(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if StrToFloat(List[index1])<StrToFloat(List[Index2]) then
    result:=-1
  else if StrToFloat(List[index1])=StrToFloat(List[Index2]) then
    Result:=0
  else
    Result:=1;
end;
//------------------------------------------------------------------------------
//传统的"四舍五入"方法
//------------------------------------------------------------------------------
function RoundEx(const Value: Extended; const Digit: Byte = 0): Extended;
var
  tmp: Extended;
begin
  tmp := Power(10, Digit);
  if Value > 0 then
    Result := Value * tmp + 0.5
  else
    Result := Value * tmp - 0.5;
  Result := Trunc(Result) / tmp;
end;
{//Math
//RoundMode参数:向下舍入-rmTruncate;向上舍入-rmUp
function RoundEx(const Value: Extended; const Digit: int = 0; RoundMode: TFPURoundingMode = rmUp): Extended;
var
  RM: TFPURoundingMode;
begin
  RM := GetRoundMode;
  try
    SetRoundMode(RoundMode);
    Result := Round(Value);
  finally
    SetRoundMode(RM);
  end;
end;     }
//------------------------------------------------------------------------------
//中文转成 array of byte åº”该就是你想要的结果
//用字节发送到网络上和接收的
//带中文的String  è½¬byte
//------------------------------------------------------------------------------
function UniCode2GB(S: string): string;
var I: Integer;
begin
  I := Length(S);
  while I >= 4 do begin
    try
      Result := WideChar(StrToInt('$' + S[I - 3] + S[I - 2] + S[I - 1] + S[I])) + Result;
    except
    end;
    I := I - 4;
  end;
end;
function GB2UniCode(GB: string): string;
var
  s: string;
  i, j, k: integer;
  a: array[1..160] of char;
begin
  s := '';
  StringToWideChar(GB, @(a[1]), 500);
  i := 1;
  while ((a[i] <> #0) or (a[i + 1] <> #0)) do begin
    j := Integer(a[i]);
    k := Integer(a[i + 1]);
    s := s + Copy(Format('%X ', [k * $100 + j + $10000]), 2, 4);
    //S := S + Char(k)+Char(j);
    i := i + 2;
  end;
  Result := s;
end;
//------------------------------------------------------------------------------
//重写SysUtils单元的BoolToStr-->BoolToHexStr
//入参:bool值
//返回:字符串,False-0,True-1
//------------------------------------------------------------------------------
function BoolToHexStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('00', '01');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := DefaultTrueBoolStr;
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := DefaultFalseBoolStr;
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
//------------------------------------------------------------------------------
// å°†Bool值转成字符串
// å…¥å‚:bool
// è¿”回:False,True字符串
//------------------------------------------------------------------------------
function BoolToString(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('False', 'True');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := DefaultTrueBoolStr;
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := DefaultFalseBoolStr;
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
//------------------------------------------------------------------------------
//将日期格式转换成Unix时间戳 , é•¿åº¦8字节
//入参:Delphi日期时间
//返回:长整形数值,从1970-01-01 00:00:00 åˆ°ADate的秒数
//------------------------------------------------------------------------------
function DateTimeToUnixDate(const ADate: TDateTime): Longint;
const
  cUnixStartDate: TDateTime = 25569.0; // 1970/01/01
begin
  Result := Round((ADate - cUnixStartDate) * 86400) - 8*3600;//东八区修正8小时
end;
//------------------------------------------------------------------------------
// å°†æ•´æ•°10241转成 '10.1KB' å­—符串
// å…¥å‚:整数
// è¿”回:字符串
//------------------------------------------------------------------------------
function FormatFileSize(size:Int64):String;
var
  size1 : String;
begin
  //不足1KB的数据,按1K显示
  if size<1024 then  size:=1
  else size := floor(size/1024);
  //从KB开始,添加单位后返回字符串
  if size<1024 then
    size1 := IntToStr(size) + ' KB'
  else if (size>=1024)and(size<1048576) then
    size1 := FormatFloat('#.#',size/1024) + ' MB'
  else if (size>=1048576)and(size<1073741824) then
    size1 := FormatFloat('#.##',size/1048576) + ' GB'
  else
    size1 := FormatFloat('#.##',size/1073741824) + ' TB';
  Result := size1;
end;
//------------------------------------------------------------------------------
// å°†æ•´æ•°10241转成 '1.02万',120000000转成 '1.2亿' å­—符串
// å…¥å‚:整数
// è¿”回:字符串
//------------------------------------------------------------------------------
function FormatNumberSize(num:Int64):String;
var
  new : String;
begin
  if num<10000 then
    new := IntToStr(num)+' '
  else if (num>=10000)and(num<100000000) then
    new := FormatFloat('#.##',num/10000) + ' ä¸‡'
  else
    new := FormatFloat('#.##',num/100000000) + ' äº¿';
  Result := new;
end;
//------------------------------------------------------------------------------
// ä»Žå­—符串str中按分隔符chr截取第i个字符串,返回截取到的字符串
//------------------------------------------------------------------------------
function SplitStr(str:string;chr:char;i:Integer):string;
var
  sltemp : TStringlist;
begin
  sltemp := TStringlist.Create();
  try
    SplitString(str,chr,sltemp);
    Result := sltemp.Strings[i];
  finally
    FreeAndNil(sltemp);
  end;
end;
//返回分割后的记录条数
function SplitStrCount(str:string; chr:char):Integer;
var
  sltemp : TStringlist;
begin
  sltemp := TStringlist.Create();
  try
    SplitString(str,chr,sltemp);
    Result := sltemp.Count;
  finally
    FreeAndNil(sltemp);
  end;
end;
//------------------------------------------------------------------------------
// Windows下杀进程,根据标题查杀
//------------------------------------------------------------------------------
procedure KillProgram(WindowTitle: string);
const
  PROCESS_TERMINATE = $0001;
var
  ProcessHandle : THandle;
  ProcessID: Integer;
  TheWindow : HWND;
begin
  TheWindow := FindWindow(nil, PChar(WindowTitle));
  GetWindowThreadProcessID(TheWindow, @ProcessID);
  ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
  TerminateProcess(ProcessHandle,4);
end;
//------------------------------------------------------------------------------
// Windows下杀进程,根据exe名称查杀
//------------------------------------------------------------------------------
function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
//------------------------------------------------------------------------------
//刷新任务栏因进程关闭而残留的图标
//------------------------------------------------------------------------------
procedure RefreshTaskbarIcon;
var
  hShellTrayWnd: HWND;   //任务栏窗口
  hTrayNotifyWnd: HWND;  //任务栏右边托盘图标+时间区
  hSysPager: HWND;     //不同系统可能有可能没有这层
  hToolbarWindow32: HWND;  //托盘图标窗口
  r: TRECT;
  width, height: integer;
  x: Integer;
begin
  hShellTrayWnd  := FindWindow('Shell_TrayWnd',nil);
  hTrayNotifyWnd := FindWindowEx(hShellTrayWnd,0,'TrayNotifyWnd',nil);
  hSysPager := FindWindowEx(hTrayNotifyWnd,0,'SysPager',nil);
  if (hSysPager <> 0) then
        hToolbarWindow32 := FindWindowEx(hSysPager,0,'ToolbarWindow32',nil)
  else
    hToolbarWindow32 := FindWindowEx(hTrayNotifyWnd,0,'ToolbarWindow32',nil);
  if (hToolbarWindow32 <> 0) then
  begin
    GetWindowRect(hToolbarWindow32,r);
    width := r.right - r.left;
    height := r.bottom - r.top;
    //从任务栏中间从左到右 MOUSEMOVE一遍,所有图标状态会被更新
    for x := 1 to width-1 do
      SendMessage(hToolbarWindow32,WM_MOUSEMOVE,0,MAKELPARAM(x,trunc(height/2)));
  end;
end;
//另一种刷新任务栏图标的方法
procedure RefreshTaskbarIcon2;
var
 TrayWindow : HWnd;
 WindowRect : TRect;
 SmallIconWidth : Integer;
 SmallIconHeight : Integer;
 CursorPos : TPoint;
 Row : Integer;
 Col : Integer;
begin
 { èŽ·å¾—ä»»åŠ¡æ å¥æŸ„å’Œè¾¹æ¡†}
 TrayWindow := FindWindowEx(FindWindow('Shell_TrayWnd',NIL),0,'TrayNotifyWnd',NIL);
 if not GetWindowRect(TrayWindow,WindowRect) then
   Exit;
 { èŽ·å¾—å°å›¾æ ‡å¤§å°}
 SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
 SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
 { ä¿å­˜å½“前鼠标位置}
 GetCursorPos(CursorPos);
 { ä½¿é¼ æ ‡å¿«é€Ÿåˆ’过每个图标 }
 with WindowRect do
 begin
   for Row := 0 to (Bottom - Top) DIV SmallIconHeight do
   begin
     for Col := 0 to (Right - Left) DIV SmallIconWidth do
     begin
       SetCursorPos(Left + Col * SmallIconWidth, Top + Row * SmallIconHeight);
       Sleep(10);  //发现这个地方参数为 0 çš„æ—¶å€™ï¼Œæœ‰æ—¶å€™æ˜¯ä¸å¤Ÿçš„
     end;
   end;
 end;
 {恢复鼠标位置}
 SetCursorPos(CursorPos.X,CursorPos.Y);
 { é‡ç”»ä»»åŠ¡æ  }
 RedrawWindow(TrayWindow,NIL,0,RDW_INVALIDATE OR RDW_ERASE OR RDW_UPDATENOW);
end;
//------------------------------------------------------------------------------
//强行关闭操作系统的函数
//------------------------------------------------------------------------------
{procedure RebootSystem();
begin
  if GetOperatingSystem() = 'Windows NT/2000/XP' then
  begin
    Get_Shutdown_Privilege();
    //调用此函数会出现系统关机提示窗口,并允许用户取消关机动作,去掉就不显示提示窗口
    //InitiateSystemShutDown(nil, '关机提示', 3, True, False);
    //ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
    ExitWindowsEx(EWX_REBOOT+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG, $FFFF);
  end
  else
  begin
    ExitWindowsEx(EWX_REBOOT+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG, $FFFF);
  end;
end; }
//获取操作系统信息
function GetOperatingSystem(): string;
var
  osVerInfo: TOSVersionInfo;
begin
  Result:= '';
  osVerInfo.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
    case osVerInfo.dwPlatformId of
    VER_PLATFORM_WIN32_NT:
      begin
        Result:= 'Windows NT/2000/XP'
      end;
    VER_PLATFORM_WIN32_WINDOWS:
      begin
        Result := 'Windows 95/98/98SE/Me';
      end;
  end;
end;
//获得用户关机特权,仅对Windows NT/2000/XP
{procedure Get_Shutdown_Privilege();
var
  rl: Cardinal;
  hToken: Cardinal;
  tkp: TOKEN_PRIVILEGES;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
  if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
  begin
    tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
    tkp.PrivilegeCount:= 1;
    AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
  end;
end;   }
//----------------------------------------------------------------------------//
// æ ¹æ®ç¨‹åºåç§°èŽ·å– HWND的方法                                                //
// 1.GetHWndByPID()获取PID;2.GetHwndByAppName()获取HWND                      //
//----------------------------------------------------------------------------//
//根据 ProcessId获取进程的窗口句柄如下:
//1.通过EnumWindows枚举所有窗口
//2.使用GetWindowThreadProcessID,通过窗口句柄获取进程ID
//3.比较获取的进程ID与当前已知的进程ID,判断是否为需要的窗口
//跟据ProcessId获取进程的窗口句柄
function GetHWndByPID(const hPID: THandle): THandle;
  type
    PEnumInfo = ^TEnumInfo;
    TEnumInfo = record
    ProcessID: DWORD;
    HWND: THandle;
  end;
  function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
  var
    PID: DWORD;
  begin
    GetWindowThreadProcessID(Wnd, @PID);
    Result := (PID <> EI.ProcessID) or
        (not IsWindowVisible(WND)) or
        (not IsWindowEnabled(WND));
    if not Result then EI.HWND := WND;
  end;
  function FindMainWindow(PID: DWORD): DWORD;
  var
    EI: TEnumInfo;
  begin
    EI.ProcessID := PID;
    EI.HWND := 0;
    EnumWindows(@EnumWindowsProc, Integer(@EI));
    Result := EI.HWND;
  end;
begin
    if hPID<>0 then
    Result:=FindMainWindow(hPID)
    else
    Result:=0;
end;
//-----------------------------------------------------------------------------
//根据 AppName获取程序HWND
//入参 = '应用程序名.exe'
//返回 = ç¨‹åºå¥æŸ„
//-----------------------------------------------------------------------------
function GetHwndByAppName(const AppName: String): THandle;
var
  pName : string;         //进程名
  hSnapshot : THandle;    //进程快照句柄
  tPE : TProcessEntry32;  //进程入口的结构体信息
  flag : BOOL;
begin
  Result := 0;
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
  tPE.dwSize:= Sizeof(tPE);
  flag := Process32First(hSnapshot, tPE); //得到系统中第一个进程
  //循环例举
  while flag do begin
    pName := tPE.szExeFile;
    if(pName = AppName) then
      Result := GetHWndByPID(tPE.th32ProcessID);
    flag := Process32Next(hSnapshot, tPE);
  end;
  CloseHandle(hSnapshot); // é‡Šæ”¾å¿«ç…§å¥æŸ„
end;
//-----------------------------------------------------------------------------
//封装的动态Dll函数调用方法
//CallFunc('user32.dll', 'MessageBoxA', [0, 'hello world', 'title', MB_OK]);
//CallFunc('user32.dll', 'MessageBeep', []);
//CallFunc('kernel32.dll', 'Sleep', [1000]);
//-----------------------------------------------------------------------------
function CallFunc(dllname, funcname: string; const param: array of const): DWORD;
var
   hLib: THandle;
   pFunc: Pointer;
   intSize: Integer;
begin
   Result := 0;
   hLib := LoadLibrary(PChar(dllname));
   if hLib <> 0 then
   begin
     pFunc := GetProcAddress(hLib, PChar(funcname));
     if pFunc <> nil then
     begin
       // èŽ·å–å‚æ•°å¤§å°
       intSize := Length(param);
       // è‡ªåŠ¨å®Œæˆå‡½æ•°è°ƒç”¨, asm实现
       asm
         push ecx
         push esi
         mov ecx, intSize;    // å‚数的个数
         mov esi, param
         test ecx, ecx        // åˆ¤æ–­æ˜¯å¦æœ‰å‚æ•°
         je @call             // å¦‚果没有参数则跳转到函数调用处
       @again:
         dec ecx
         push dword ptr [esi + ecx * 8]   // å¾ªçŽ¯æŠŠå‚æ•°åŽ‹å…¥å †æ ˆ
         cmp ecx, 0
         jnz @again           // ä¸€ç›´å¾ªçŽ¯åˆ° ecx ä¸º0
       @call:
         call pFunc           // è°ƒç”¨å‡½æ•°
         mov @Result, eax     // è¿”回值
         pop esi
         pop ecx
       end;
     end;
     FreeLibrary(hLib);
   end;
end;
//------------------------------------------------------------------------------
// è°ƒç”¨windows系统 ping æµ‹è¯•网络是否通畅
// åŒ…含文件 Winsock
// å…¥å‚:IP地址
// è¿”回:false or true
//------------------------------------------------------------------------------
function PingHost(HostIP: String): Boolean;
type
  PIPOptionInformation =  ^TIPOptionInformation;
  TIPOptionInformation = packed record
    TTL:Byte;
    TOS:Byte;
    Flags:Byte;
    OptionsSize:Byte;
    OptionsData:PChar;
  end;
  PIcmpEchoReply= ^TIcmpEchoReply;
  TIcmpEchoReply = packed record
    Address: DWORD;
    Status:DWORD;
    RTT:DWORD;
    DataSize:Word;
    Reserved:Word;
    Data:Pointer;
    Options:TIPOptionInformation;
  end;
  TIcmpCreateFile = function:THandle;stdcall;
  TIcmpCloseHandle= function(IcmpHandle:THandle):Boolean;stdcall;
  TIcmpSendEcho=function(IcmpHandle:THandle;
                  DestinationAddress: DWORD;
                  RequestData:   Pointer;
                  RequestSize:   Word;
                  RequestOptions:   PIPOptionInformation;
                  ReplyBuffer:   Pointer;
                  ReplySize:   DWord;
                  Timeout:   DWord
                  ):DWord;stdcall;
var
  hICMP:THandle;
  hICMPdll:THandle;
  IcmpCreateFile:TIcmpCreateFile;
  IcmpCloseHandle:TIcmpCloseHandle;
  IcmpSendEcho:TIcmpSendEcho;
  pIPE:PIcmpEchoReply;//   ICMP   Echo   reply   buffer
  FIPAddress:DWORD;
  FSize:DWORD;
  FTimeOut:DWORD;
  BufferSize:DWORD;
  pReqData,pRevData:PChar;
  MyString:string;
begin
  Result:=False;
  hICMPdll:=LoadLibrary('icmp.dll');
  if hICMPdll=0 then   exit;
  @ICMPCreateFile:=GetProcAddress(hICMPdll,'IcmpCreateFile');
  @IcmpCloseHandle:=GetProcAddress(hICMPdll,'IcmpCloseHandle');
  @IcmpSendEcho:=GetProcAddress(hICMPdll, 'IcmpSendEcho');
  hICMP   :=   IcmpCreateFile;
  if (hICMP=INVALID_HANDLE_VALUE) then  exit;
  FIPAddress:=inet_addr(PChar(HostIP));
  MyString := 'Hello,World';                                 //send   data   buffer
  pReqData:=PChar(MyString);
  FSize:=40;                                                 //receive   data   buffer
  BufferSize:=SizeOf(TICMPEchoReply)+FSize;
  GetMem(pIPE,BufferSize);
  FillChar(pIPE^,SizeOf(pIPE^), 0);
  GetMem(pRevData,FSize);
  pIPE^.Data:=pRevData;
  FTimeOut:=500;
  try
    Result:=IcmpSendEcho(hICMP,
                         FIPAddress,
                         pReqData,
                         Length(MyString),
                         nil,
                         pIPE,
                         BufferSize,
                         FTimeOut)>0;
  finally
    IcmpCloseHandle(hICMP);
    FreeLibrary(hICMPdll);
    FreeMem(pRevData);
    FreeMem(pIPE);
  end;
end;
//------------------------------------------------------------------------------
// æè¿°ï¼šç§’转时间字符串
// å…¥å‚:Integer-秒
// è¿”回:String-HH:MM:SS格式字符串
//------------------------------------------------------------------------------
function SecondToTime(sec:Integer):String;
begin
  Result := TimeToStr(sec/86400);
end;
// æè¿°ï¼šç§’转换成TDateTIme格式
function SecondToTime1(second: Word): TDateTime;
var
  Hour, Min, Sec: Word;
begin
  Hour := second div 3600;
  Min := (second div 60) mod 60;
  Sec := second mod 60;
  Result := EncodeTime(Hour, Min, Sec, 0);
end;
//------------------------------------------------------------------------------
// æ‰©å……DateUtils库,增加北京时间转Int64时间格式,注意减去时区
// è¯´æ˜Žï¼š
{uses DateUtils;
 DateTimeToUnix(Now)可以转换到unix时间,但是注意的是,它得到的时间
 æ¯”c语言中time()得到的时间大了8*60*60
 å› ä¸ºNow是当前时区的时间,c语言中time()是按格林威治时间计算的,
 åŒ—京时间比格林威治时间多了8小时
 DateTimeToUnix(Now)-8*60*60 å°±å’Œc语言中time()得到的一样了}
//------------------------------------------------------------------------------
// ä½¿ç”¨ç¤ºä¾‹ï¼šDateTimeToUnixPro(VarToDateTime(edit1.Text))
function DateTimeToUnixPro(const AValue: TDateTime): Int64;
begin
  Result := DateTimeToUnix(AValue)- 8*60*60 ;
end;
function UnixToDateTimePro(const AValue: Int64): TDateTime;
begin
  Result := UnixToDateTime(floor(AValue/1000) + 8*60*60);
end;
//------------------------------------------------------------------------------
// ç§‘学计数法与浮点型数字互转,采用字符串输入输出
// uses SysUtils
//
// eg: '-1.4857E-02' --> '-0.014857'
//------------------------------------------------------------------------------
//科学计数转浮点型,'-1.4857E-02' --> '-0.014857'
function ExpToFloat(s:String):String;
var
  f : Extended;
begin
  f := StrToFloatDef(s,0);
  Result := FloatToStr(f);
end;
//浮点型转科学计数,'-0.014857' --> '-1.4857E-02'
function FloatToExp(s:String):String;
var
  f : Extended;
begin
  f := StrToFloatDef(s,0);
  Result := FloatToStrF(f, ffExponent,7,2);
end;
//------------------------------------------------------------------------------
// å°†Bool值转成开关字符
// å…¥å‚:bool
// è¿”回:开启,关闭字符串
//------------------------------------------------------------------------------
function BoolToString1(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('关闭', '开启');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := '开启';
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := '关闭';
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
//------------------------------------------------------------------------------
// å°†Bool值转成开关字符
// å…¥å‚:bool
// è¿”回:开,关字符串
//------------------------------------------------------------------------------
function BoolToString3(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('关', '开');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := '开';
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := '关';
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
//------------------------------------------------------------------------------
// å°†Bool值转成开关字符
// å…¥å‚:bool
// è¿”回:0,1字符串
//------------------------------------------------------------------------------
function BoolToString2(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('0', '1');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := '1';
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := '0';
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
function BoolToString4(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('false', 'true');
begin
  if UseBoolStrs then
  begin
    if Length(TrueBoolStrs) = 0 then
    begin
      SetLength(TrueBoolStrs, 1);
      TrueBoolStrs[0] := DefaultTrueBoolStr;
    end;
    if Length(FalseBoolStrs) = 0 then
    begin
      SetLength(FalseBoolStrs, 1);
      FalseBoolStrs[0] := DefaultFalseBoolStr;
    end;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
//------------------------------------------------------------------------
// æ•´å½¢è½¬ä¸ºå¸ƒå°”值
// è¾“入:integer
// è¾“出:True/False
// è¯´æ˜Žï¼šå¦‚æžœAValue不等于0,则Result为True,否则为False。
//------------------------------------------------------------------------
function IntToBool(AValue: Integer): Boolean;
begin
  Result := AValue <> 0; // å¦‚æžœAValue不等于0,则Result为True,否则为False。
end;
//------------------------------------------------------------------------
// çº¿æ€§æ’值算法
// è¾“入:(x0、y0)(x1、y1),及需要插值的目标点x的值
// è¾“出:x对应的插值y值
// è¯´æ˜Žï¼šè¯¥å‡½æ•°çš„实现原理是根据线性插值的公式,计算目标点x对应的y值。
//       å‡½æ•°é¦–先计算出目标点x在数据点x0和x1之间的位置占比,即(x - x0) / (x1 - x0),
//       ç„¶åŽå°†è¯¥æ¯”例乘以y1 - y0,并加上y0,即可得到目标点x对应的插值y值。
//------------------------------------------------------------------------
function LinearInterpolation(x0, y0, x1, y1, x: Double): Double;
begin
  Result := y0 + (y1 - y0) * (x - x0) / (x1 - x0);
end;
//------------------------------------------------------------------------------
// æ‹‰æ ¼æœ—日插值算法
// å…¥å‚:x:表示给定的一组 x åæ ‡ï¼Œæ˜¯ä¸€ä¸ªå®žæ•°æ•°ç»„。
//       y:表示给定的一组 y åæ ‡ï¼Œä¹Ÿæ˜¯ä¸€ä¸ªå®žæ•°æ•°ç»„,与 x æ•°ç»„一一对应。
//       n:表示 x å’Œ y æ•°ç»„中的数据点个数。
//      xi:表示要求解的 x åæ ‡ï¼Œå³è¦æ±‚在 x è½´ä¸Šæ‰¾åˆ°ä¸Žä¹‹å¯¹åº”çš„ y åæ ‡ã€‚
// è¿”回值:返回 xi å¯¹åº”çš„ y åæ ‡ã€‚
// å‡½æ•°å®žçŽ°ï¼šå®šäº†ä¸¤ä¸ªå¾ªçŽ¯å˜é‡ i å’Œ j,用于遍历 x å’Œ y æ•°ç»„。然后在外层循环中,
//           éåŽ†æ¯ä¸ªæ•°æ®ç‚¹ i,计算对应的 Lagrange æ’值多项式 L,将每个数据点
//           Lagrange å¤šé¡¹å¼ L ä¸Žå¯¹åº”çš„ y åæ ‡ç›¸ä¹˜ï¼Œå¹¶æ±‚和得到 p。
//           æœ€åŽè¿”回 p,即为所求的 xi å¯¹åº”çš„ y åæ ‡ã€‚
//------------------------------------------------------------------------------
function LagrangeInterpolation(x, y: array of Double; n: Integer; xi: Double): Double;
var
  i, j: Integer;
  p, L: Double;
begin
  p := 0.0;
  for i := 0 to n do
  begin
    L := 1.0;
    for j := 0 to n do
      if j <> i then
        L := L * (xi - x[j]) / (x[i] - x[j]);
    p := p + y[i] * L;
  end;
  Result := p;
end;
//------------------------------------------------------------------------------
// ç‰›é¡¿æ’值算法
// å…¥å‚:x:表示给定的一组 x åæ ‡ï¼Œæ˜¯ä¸€ä¸ªå®žæ•°æ•°ç»„。
//       fx:表示给定的一组 y åæ ‡ï¼Œä¹Ÿæ˜¯ä¸€ä¸ªå®žæ•°æ•°ç»„,与 x æ•°ç»„一一对应。
//       n:表示 x å’Œ y æ•°ç»„中的数据点个数。
//       t:表示要求解的 x åæ ‡ï¼Œå³è¦æ±‚在 x è½´ä¸Šæ‰¾åˆ°ä¸Žä¹‹å¯¹åº”çš„ y åæ ‡ã€‚
// è¿”回值:返回 t å¯¹åº”çš„ y åæ ‡ã€‚
//------------------------------------------------------------------------------
function NewtonInterpolation(x, fx: array of Double; n: Integer; t: Double): Double;
var
  i, j: Integer;
  c: array of Double;
  sum: Double;
begin
  SetLength(c, n);
  for i := 0 to n - 1 do
    c[i] := fx[i];
  for i := 1 to n - 1 do
  begin
    for j := n - 1 downto i do
      c[j] := (c[j] - c[j - 1]) / (x[j] - x[j - i]);
  end;
  sum := c[n - 1];
  for i := n - 2 downto 0 do
  begin
    sum := c[i] + (t - x[i]) * sum;
  end;
  Result := sum;
end;
//------------------------------------------------------------------------------
// æœ€å°äºŒä¹˜æ³•插值算法
// å…¥å‚:数组 x å’Œ y
//       æ•°ç»„长度 n
//       å‚æ•° t表示要插值的位置
// è¿”回:插值结果
// å…¬å¼ï¼šf(t) = a * t + b + (y[i] - a * x[i] - b) * sum[(x[i] - t)^2] / sum[(x[i] - t)^2]
// è§£é‡Šï¼šå…¶ä¸­ï¼Œa å’Œ b æ˜¯æœ€å°äºŒä¹˜æ³•的系数,y[i] å’Œ x[i] åˆ†åˆ«æ˜¯è¾“入数组的第 i ä¸ª
//       å…ƒç´ çš„值。sum[] è¡¨ç¤ºæ±‚和符号。函数通过计算 a å’Œ b,然后计算 f(t) æ¥èŽ·å¾—æ’å€¼ç»“æžœã€‚
//------------------------------------------------------------------------------
function LeastSquaresInterpolation(x, y: array of Double; n: Integer; t: Double): Double;
  function dot2(a, b: array of Double): Double;
  var
    i: Integer;
  begin
    Result := 0;
    for i := 0 to Length(a) - 1 do
      Result := Result + a[i] * b[i];
  end;
  function dot1(a: array of Double): Double;
  begin
    Result := dot2(a, a);
  end;
var
  i : Integer;
  a, b, c, d, s, ss: Double;
begin
  if n < 2 then
  begin
    Result := 0;
    Exit;
  end;
  s := 0;
  ss := 0;
  for i := 0 to n - 1 do
  begin
    s := s + y[i];
    ss := ss + sqr(y[i]);
  end;
  a := (n * dot2(x, y) - dot1(x) * s) / (n * dot2(x, x) - sqr(dot1(x)));
  b := (s - a * dot1(x)) / n;
  c := 0;
  d := 0;
  for i := 0 to n - 1 do
  begin
    c := c + (y[i] - a * x[i] - b) * sqr(x[i] - t);
    d := d + sqr(x[i] - t);
  end;
  Result := a * t + b + c / d;
end;
//------------------------------------------------------------------------
// è´å¶æ–¯æ’值算法
// å…¥å‚:x和y是已知的数据点,xi是插值的位置,sigma是高斯核函数的带宽参数
// è¾“出:
// è¯´æ˜Žï¼šè¯¥ç®—法使用高斯核函数来对输入数据进行加权,以便生成插值结果。其中,
//       GaussianKernel()计算两点之间的高斯核函数值,BayesianInterpolation()
//       è®¡ç®—加权平均值并返回插值结果。
//------------------------------------------------------------------------
function BayesianInterpolation(x,y: array of Double; xi: Double; sigma: Double): Double;
  function GaussianKernel(x, xi, sigma: Double): Double;
  begin
    GaussianKernel := exp(-(x - xi) * (x - xi) / (2 * sigma * sigma));
  end;
var
  n, i: Integer;
  k, W, Wsum, yfit: Double;
begin
  n := Length(x);
  Wsum := 0;
  yfit := 0;
  for i := 0 to n - 1 do
  begin
    k := GaussianKernel(x[i], xi, sigma);
    W := k / sigma;
    Wsum := Wsum + W;
    yfit := yfit + W * y[i];
  end;
  BayesianInterpolation := yfit / Wsum;
end;
//------------------------------------------------------------------------------
// èŽ·å–13位Int64格式毫秒
// å…¥å‚:当前时间-1970-1-1 00:00:00
// è¿”回:Int64格式毫秒
//------------------------------------------------------------------------------
function GetTimeStampMilliseconds:string;
var
  SysTime:TsystemTime;
  timen,time2:TDateTime;
  ss2,ss3:int64;
  str2:string;
begin
  GetLocalTime(SysTime);
  timen:= SystemTimeToDateTime(SysTime);
  time2 := EncodeDateTime( 1970, 1, 1, 0, 0, 0, 0 );
  ss2 := 28800000;
  ss3 := MilliSecondsBetween( timen, time2 );
  ss3 :=ss3- ss2;
  str2 := IntToStr(ss3);
  result:=str2;
end;
function GetMillisecondTimeStamp: Int64;
var
  st: TDateTime;
begin
  st := EncodeDateTime( 1970, 1, 1, 0, 0, 0, 0 );
  Result := MilliSecondsBetween( Now, st )-8*60*60*1000;
end;
//交换16进制数的高低位
// ABCD--> CDAB
function SwapHighLowWord(Value: Word): Word;
begin
  // äº¤æ¢é«˜ä½Žä½
  Result := (Value and $FF) shl 8 or (Value and $FF00) shr 8;
end;
end.
src/pub/UntDes.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,421 @@
{*************************************************************************}
{ å•元描述: DES公用密匙对加密算法单元                                     }
{ å•元版本: 1.0                                                           }
{ å¼€å‘环境: Delphi 2009, æ”¯æŒUnicode                                      }
{ å¼€å‘人员: æŽè‰¯åº­                                                        }
{ ä¿®æ”¹æ—¥æœŸ: 2009-11-25                                                    }
{*************************************************************************}
unit UntDes;
interface
uses SysUtils;
type
  TKeyByte = array[0..5] of Byte;
  TDesMode = (dmEncry, dmDecry);
  function EncryStr(Str, Key: String): String;
  function DecryStr(Str, Key: String): String;
  function EncryStrHex(Str, Key: String): String;
  function DecryStrHex(StrHex, Key: String): String;
const
  BitIP: array[0..63] of Byte =
    (57, 49, 41, 33, 25, 17,  9,  1,
     59, 51, 43, 35, 27, 19, 11,  3,
     61, 53, 45, 37, 29, 21, 13,  5,
     63, 55, 47, 39, 31, 23, 15,  7,
     56, 48, 40, 32, 24, 16,  8,  0,
     58, 50, 42, 34, 26, 18, 10,  2,
     60, 52, 44, 36, 28, 20, 12,  4,
     62, 54, 46, 38, 30, 22, 14,  6 );
  BitCP: array[0..63] of Byte =
    ( 39,  7, 47, 15, 55, 23, 63, 31,
      38,  6, 46, 14, 54, 22, 62, 30,
      37,  5, 45, 13, 53, 21, 61, 29,
      36,  4, 44, 12, 52, 20, 60, 28,
      35,  3, 43, 11, 51, 19, 59, 27,
      34,  2, 42, 10, 50, 18, 58, 26,
      33,  1, 41,  9, 49, 17, 57, 25,
      32,  0, 40,  8, 48, 16, 56, 24 );
  BitExp: array[0..47] of Integer =
    ( 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9,10,
      11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,
      21,22,23,24,23,24,25,26,27,28,27,28,29,30,31,0  );
  BitPM: array[0..31] of Byte =
    ( 15, 6,19,20,28,11,27,16, 0,14,22,25, 4,17,30, 9,
       1, 7,23,13,31,26, 2, 8,18,12,29, 5,21,10, 3,24 );
  sBox: array[0..7] of array[0..63] of Byte =
    ( ( 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
         0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
         4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 ),
      ( 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
         3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
         0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
        13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 ),
      ( 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
        13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
        13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
         1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 ),
      (  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
        13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
        10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
         3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 ),
      (  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
         4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
        11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 ),
      ( 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
        10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
         9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
         4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 ),
      (  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
         1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
         6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 ),
      ( 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
         1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
         7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
         2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 ) );
  BitPMC1: array[0..55] of Byte =
    ( 56, 48, 40, 32, 24, 16,  8,
       0, 57, 49, 41, 33, 25, 17,
       9,  1, 58, 50, 42, 34, 26,
      18, 10,  2, 59, 51, 43, 35,
      62, 54, 46, 38, 30, 22, 14,
       6, 61, 53, 45, 37, 29, 21,
      13,  5, 60, 52, 44, 36, 28,
      20, 12,  4, 27, 19, 11,  3 );
  BitPMC2: array[0..47] of Byte =
    ( 13, 16, 10, 23,  0,  4,
       2, 27, 14,  5, 20,  9,
      22, 18, 11,  3, 25,  7,
      15,  6, 26, 19, 12,  1,
      40, 51, 30, 36, 46, 54,
      29, 39, 50, 44, 32, 47,
      43, 48, 38, 55, 33, 52,
      45, 41, 49, 35, 28, 31 );
var
  subKey: array[0..15] of TKeyByte;
implementation
procedure initPermutation(var inData: array of Byte);
var
  newData: array[0..7] of Byte;
  i: Integer;
begin
  FillChar(newData, 8, 0);
  for i := 0 to 63 do
    if (inData[BitIP[i] shr 3] and (1 shl (7- (BitIP[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)));
  for i := 0 to 7 do inData[i] := newData[i];
end;
procedure conversePermutation(var inData: array of Byte);
var
  newData: array[0..7] of Byte;
  i: Integer;
begin
  FillChar(newData, 8, 0);
  for i := 0 to 63 do
    if (inData[BitCP[i] shr 3] and (1 shl (7-(BitCP[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)));
  for i := 0 to 7 do inData[i] := newData[i];
end;
procedure expand(inData: array of Byte; var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 6, 0);
  for i := 0 to 47 do
    if (inData[BitExp[i] shr 3] and (1 shl (7-(BitExp[i] and $07)))) <> 0 then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)));
end;
procedure permutation(var inData: array of Byte);
var
  newData: array[0..3] of Byte;
  i: Integer;
begin
  FillChar(newData, 4, 0);
  for i := 0 to 31 do
    if (inData[BitPM[i] shr 3] and (1 shl (7-(BitPM[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07)));
  for i := 0 to 3 do inData[i] := newData[i];
end;
function si(s,inByte: Byte): Byte;
var
  c: Byte;
begin
  c := (inByte and $20) or ((inByte and $1e) shr 1) or
    ((inByte and $01) shl 4);
  Result := (sBox[s][c] and $0f);
end;
procedure permutationChoose1(inData: array of Byte;
  var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 7, 0);
  for i := 0 to 55 do
    if (inData[BitPMC1[i] shr 3] and (1 shl (7-(BitPMC1[i] and $07)))) <> 0 then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)));
end;
procedure permutationChoose2(inData: array of Byte;
  var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 6, 0);
  for i := 0 to 47 do
    if (inData[BitPMC2[i] shr 3] and (1 shl (7-(BitPMC2[i] and $07)))) <> 0 then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07)));
end;
procedure cycleMove(var inData: array of Byte; bitMove: Byte);
var
  i: Integer;
begin
  for i := 0 to bitMove - 1 do
  begin
    inData[0] := (inData[0] shl 1) or (inData[1] shr 7);
    inData[1] := (inData[1] shl 1) or (inData[2] shr 7);
    inData[2] := (inData[2] shl 1) or (inData[3] shr 7);
    inData[3] := (inData[3] shl 1) or ((inData[0] and $10) shr 4);
    inData[0] := (inData[0] and $0f);
  end;
end;
procedure makeKey(inKey: array of Byte; var outKey: array of TKeyByte);
const
  bitDisplace: array[0..15] of Byte =
    ( 1,1,2,2, 2,2,2,2, 1,2,2,2, 2,2,2,1 );
var
  outData56: array[0..6] of Byte;
  key28l: array[0..3] of Byte;
  key28r: array[0..3] of Byte;
  key56o: array[0..6] of Byte;
  i: Integer;
begin
  permutationChoose1(inKey, outData56);
  key28l[0] := outData56[0] shr 4;
  key28l[1] := (outData56[0] shl 4) or (outData56[1] shr 4);
  key28l[2] := (outData56[1] shl 4) or (outData56[2] shr 4);
  key28l[3] := (outData56[2] shl 4) or (outData56[3] shr 4);
  key28r[0] := outData56[3] and $0f;
  key28r[1] := outData56[4];
  key28r[2] := outData56[5];
  key28r[3] := outData56[6];
  for i := 0 to 15 do
  begin
    cycleMove(key28l, bitDisplace[i]);
    cycleMove(key28r, bitDisplace[i]);
    key56o[0] := (key28l[0] shl 4) or (key28l[1] shr 4);
    key56o[1] := (key28l[1] shl 4) or (key28l[2] shr 4);
    key56o[2] := (key28l[2] shl 4) or (key28l[3] shr 4);
    key56o[3] := (key28l[3] shl 4) or (key28r[0]);
    key56o[4] := key28r[1];
    key56o[5] := key28r[2];
    key56o[6] := key28r[3];
    permutationChoose2(key56o, outKey[i]);
  end;
end;
procedure encry(inData, subKey: array of Byte;
   var outData: array of Byte);
var
  outBuf: array[0..5] of Byte;
  buf: array[0..7] of Byte;
  i: Integer;
begin
  expand(inData, outBuf);
  for i := 0 to 5 do outBuf[i] := outBuf[i] xor subKey[i];
                                                // outBuf       xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
  buf[0] := outBuf[0] shr 2;                                  //xxxxxx -> 2
  buf[1] := ((outBuf[0] and $03) shl 4) or (outBuf[1] shr 4); // 4 <- xx xxxx -> 4
  buf[2] := ((outBuf[1] and $0f) shl 2) or (outBuf[2] shr 6); //        2 <- xxxx xx -> 6
  buf[3] := outBuf[2] and $3f;                                //                    xxxxxx
  buf[4] := outBuf[3] shr 2;                                  //                           xxxxxx
  buf[5] := ((outBuf[3] and $03) shl 4) or (outBuf[4] shr 4); //                                 xx xxxx
  buf[6] := ((outBuf[4] and $0f) shl 2) or (outBuf[5] shr 6); //                                        xxxx xx
  buf[7] := outBuf[5] and $3f;                                //                                               xxxxxx
  for i := 0 to 7 do buf[i] := si(i, buf[i]);
  for i := 0 to 3 do outBuf[i] := (buf[i*2] shl 4) or buf[i*2+1];
  permutation(outBuf);
  for i := 0 to 3 do outData[i] := outBuf[i];
end;
procedure desData(desMode: TDesMode;
  inData: array of Byte; var outData: array of Byte);
// inData, outData éƒ½ä¸º8Bytes,否则出错
var
  i, j: Integer;
  temp, buf: array[0..3] of Byte;
begin
  for i := 0 to 7 do outData[i] := inData[i];
  initPermutation(outData);
  if desMode = dmEncry then
  begin
    for i := 0 to 15 do
    begin
      for j := 0 to 3 do temp[j] := outData[j];                 //temp = Ln
      for j := 0 to 3 do outData[j] := outData[j + 4];            //Ln+1 = Rn
      encry(outData, subKey[i], buf);                           //Rn ==Kn==> buf
      for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j];  //Rn+1 = Ln^buf
    end;
    for j := 0 to 3 do temp[j] := outData[j + 4];
    for j := 0 to 3 do outData[j + 4] := outData[j];
    for j := 0 to 3 do outData[j] := temp[j];
  end
  else if desMode = dmDecry then
  begin
    for i := 15 downto 0 do
    begin
      for j := 0 to 3 do temp[j] := outData[j];
      for j := 0 to 3 do outData[j] := outData[j + 4];
      encry(outData, subKey[i], buf);
      for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j];
    end;
    for j := 0 to 3 do temp[j] := outData[j + 4];
    for j := 0 to 3 do outData[j + 4] := outData[j];
    for j := 0 to 3 do outData[j] := temp[j];
  end;
  conversePermutation(outData);
end;
//////////////////////////////////////////////////////////////
function EncryStr(Str, Key: String): String;
var
  StrByte, OutByte, KeyByte: array[0..7] of Byte;
  StrResult: String;
  I, J: Integer;
begin
  if (Length(Str) > 0) and (Ord(Str[Length(Str)]) = 0) then
    raise Exception.Create('Error: the last char is NULL char.');
  if Length(Key) < 8 then
    while Length(Key) < 8 do Key := Key + Chr(0);
  while Length(Str) mod 8 <> 0 do Str := Str + Chr(0);
  for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1]);
  makeKey(keyByte, subKey);
  StrResult := '';
  for I := 0 to Length(Str) div 8 - 1 do
  begin
    for J := 0 to 7 do
      StrByte[J] := Ord(Str[I * 8 + J + 1]);
    desData(dmEncry, StrByte, OutByte);
    for J := 0 to 7 do
      StrResult := StrResult + Chr(OutByte[J]);
  end;
  Result := StrResult;
end;
function DecryStr(Str, Key: String): String;
var
  StrByte, OutByte, KeyByte: array[0..7] of Byte;
  StrResult: String;
  I, J: Integer;
begin
  if Length(Key) < 8 then
    while Length(Key) < 8 do Key := Key + Chr(0);
  for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1]);
  makeKey(keyByte, subKey);
  StrResult := '';
  for I := 0 to Length(Str) div 8 - 1 do
  begin
    for J := 0 to 7 do StrByte[J] := Ord(Str[I * 8 + J + 1]);
    desData(dmDecry, StrByte, OutByte);
    for J := 0 to 7 do
      StrResult := StrResult + Chr(OutByte[J]);
  end;
  while (Length(StrResult) > 0) and
    (Ord(StrResult[Length(StrResult)]) = 0) do
    Delete(StrResult, Length(StrResult), 1);
  Result := StrResult;
end;
///////////////////////////////////////////////////////////
function EncryStrHex(Str, Key: String): String;
var
  StrResult, TempResult, Temp: String;
  I: Integer;
begin
  TempResult := EncryStr(Str, Key);
  StrResult := '';
  for I := 0 to Length(TempResult) - 1 do
  begin
    Temp := Format('%x', [Ord(TempResult[I + 1])]);
    if Length(Temp) = 1 then Temp := '0' + Temp;
    StrResult := StrResult + Temp;
  end;
  Result := StrResult;
end;
function DecryStrHex(StrHex, Key: String): String;
  function HexToInt(Hex: String): Integer;
  var
    I, Res: Integer;
    ch: Char;
  begin
    Res := 0;
    for I := 0 to Length(Hex) - 1 do
    begin
      ch := Hex[I + 1];
      if (ch >= '0') and (ch <= '9') then
        Res := Res * 16 + Ord(ch) - Ord('0')
      else if (ch >= 'A') and (ch <= 'F') then
        Res := Res * 16 + Ord(ch) - Ord('A') + 10
      else if (ch >= 'a') and (ch <= 'f') then
        Res := Res * 16 + Ord(ch) - Ord('a') + 10
      else raise Exception.Create('Error: not a Hex String');
    end;
    Result := Res;
  end;
var
  Str, Temp: String;
  I: Integer;
begin
  Str := '';
  for I := 0 to Length(StrHex) div 2 - 1 do
  begin
    Temp := Copy(StrHex, I * 2 + 1, 2);
    Str := Str + Chr(HexToInt(Temp));
  end;
  Result := DecryStr(Str, Key);
end;
end.
src/sqlite3/SQLite3.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
unit SQLite3;
{
  Simplified interface for SQLite.
  Updated for Sqlite 3 by Tim Anderson (tim@itwriting.com)
  Note: NOT COMPLETE for version 3, just minimal functionality
  Adapted from file created by Pablo Pissanetzky (pablo@myhtpc.net)
  which was based on SQLite.pas by Ben Hochstrasser (bhoc@surfeu.ch)
}
{$IFDEF FPC}
  {$MODE DELPHI}
  {$H+}            (* use AnsiString *)
  {$PACKENUM 4}    (* use 4-byte enums *)
  {$PACKRECORDS C} (* C/C++-compatible record packing *)
{$ELSE}
  {$MINENUMSIZE 4} (* use 4-byte enums *)
{$ENDIF}
interface
const
{$IF Defined(MSWINDOWS)}
  SQLiteDLL = 'core\sqlite3_x86.dll';
{$ELSEIF Defined(DARWIN)}
  SQLiteDLL = 'libsqlite3.dylib';
  {$linklib libsqlite3}
{$ELSEIF Defined(UNIX)}
  SQLiteDLL = 'sqlite3.so';
{$IFEND}
// Return values for sqlite3_exec() and sqlite3_step()
const
  SQLITE_OK          =  0; // Successful result
  (* beginning-of-error-codes *)
  SQLITE_ERROR       =  1; // SQL error or missing database
  SQLITE_INTERNAL    =  2; // An internal logic error in SQLite
  SQLITE_PERM        =  3; // Access permission denied
  SQLITE_ABORT       =  4; // Callback routine requested an abort
  SQLITE_BUSY        =  5; // The database file is locked
  SQLITE_LOCKED      =  6; // A table in the database is locked
  SQLITE_NOMEM       =  7; // A malloc() failed
  SQLITE_READONLY    =  8; // Attempt to write a readonly database
  SQLITE_INTERRUPT   =  9; // Operation terminated by sqlite3_interrupt()
  SQLITE_IOERR       = 10; // Some kind of disk I/O error occurred
  SQLITE_CORRUPT     = 11; // The database disk image is malformed
  SQLITE_NOTFOUND    = 12; // (Internal Only) Table or record not found
  SQLITE_FULL        = 13; // Insertion failed because database is full
  SQLITE_CANTOPEN    = 14; // Unable to open the database file
  SQLITE_PROTOCOL    = 15; // Database lock protocol error
  SQLITE_EMPTY       = 16; // Database is empty
  SQLITE_SCHEMA      = 17; // The database schema changed
  SQLITE_TOOBIG      = 18; // Too much data for one row of a table
  SQLITE_CONSTRAINT  = 19; // Abort due to contraint violation
  SQLITE_MISMATCH    = 20; // Data type mismatch
  SQLITE_MISUSE      = 21; // Library used incorrectly
  SQLITE_NOLFS       = 22; // Uses OS features not supported on host
  SQLITE_AUTH        = 23; // Authorization denied
  SQLITE_FORMAT      = 24; // Auxiliary database format error
  SQLITE_RANGE       = 25; // 2nd parameter to sqlite3_bind out of range
  SQLITE_NOTADB      = 26; // File opened that is not a database file
  SQLITE_ROW         = 100; // sqlite3_step() has another row ready
  SQLITE_DONE        = 101; // sqlite3_step() has finished executing
  SQLITE_INTEGER = 1;
  SQLITE_FLOAT   = 2;
  SQLITE_TEXT    = 3;
  SQLITE_BLOB    = 4;
  SQLITE_NULL    = 5;
  SQLITE_UTF8     = 1;
  SQLITE_UTF16    = 2;
  SQLITE_UTF16BE  = 3;
  SQLITE_UTF16LE  = 4;
  SQLITE_ANY      = 5;
  SQLITE_STATIC    {: TSQLite3Destructor} = Pointer(0);
  SQLITE_TRANSIENT {: TSQLite3Destructor} = Pointer(-1);
type
  TSQLiteDB = Pointer;
  TSQLiteResult = ^PAnsiChar;
  TSQLiteStmt = Pointer;
  TSQLiteBackup = pointer;
type
  PPAnsiCharArray = ^TPAnsiCharArray;
  TPAnsiCharArray = array[0 .. (MaxInt div SizeOf(PAnsiChar))-1] of PAnsiChar;
type
  TSQLiteExecCallback = function(UserData: Pointer; NumCols: integer; ColValues:
    PPAnsiCharArray; ColNames: PPAnsiCharArray): integer; cdecl;
  TSQLiteBusyHandlerCallback = function(UserData: Pointer; P2: integer): integer; cdecl;
  //function prototype for define own collate
  TCollateXCompare = function(UserData: pointer; Buf1Len: integer; Buf1: pointer;
    Buf2Len: integer; Buf2: pointer): integer; cdecl;
function SQLite3_Open(filename: PAnsiChar; var db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_open';
function SQLite3_Close(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_close';
function SQLite3_Exec(db: TSQLiteDB; SQLStatement: PAnsiChar; CallbackPtr: TSQLiteExecCallback; UserData: Pointer; var ErrMsg: PAnsiChar): integer; cdecl; external SQLiteDLL name 'sqlite3_exec';
function SQLite3_Version(): PAnsiChar; cdecl; external SQLiteDLL name 'sqlite3_libversion';
function SQLite3_ErrMsg(db: TSQLiteDB): PAnsiChar; cdecl; external SQLiteDLL name 'sqlite3_errmsg';
function SQLite3_ErrCode(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_errcode';
procedure SQlite3_Free(P: PAnsiChar); cdecl; external SQLiteDLL name 'sqlite3_free';
function SQLite3_GetTable(db: TSQLiteDB; SQLStatement: PAnsiChar; var ResultPtr: TSQLiteResult; var RowCount: Cardinal; var ColCount: Cardinal; var ErrMsg: PAnsiChar): integer; cdecl; external SQLiteDLL name 'sqlite3_get_table';
procedure SQLite3_FreeTable(Table: TSQLiteResult); cdecl; external SQLiteDLL name 'sqlite3_free_table';
function SQLite3_Complete(P: PAnsiChar): boolean; cdecl; external SQLiteDLL name 'sqlite3_complete';
function SQLite3_LastInsertRowID(db: TSQLiteDB): int64; cdecl; external SQLiteDLL name 'sqlite3_last_insert_rowid';
procedure SQLite3_Interrupt(db: TSQLiteDB); cdecl; external SQLiteDLL name 'sqlite3_interrupt';
procedure SQLite3_BusyHandler(db: TSQLiteDB; CallbackPtr: TSQLiteBusyHandlerCallback; UserData: Pointer); cdecl; external SQLiteDLL name 'sqlite3_busy_handler';
procedure SQLite3_BusyTimeout(db: TSQLiteDB; TimeOut: integer); cdecl; external SQLiteDLL name 'sqlite3_busy_timeout';
function SQLite3_Changes(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_changes';
function SQLite3_TotalChanges(db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_total_changes';
function SQLite3_Prepare(db: TSQLiteDB; SQLStatement: PAnsiChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PAnsiChar): integer; cdecl; external SQLiteDLL name 'sqlite3_prepare';
function SQLite3_Prepare_v2(db: TSQLiteDB; SQLStatement: PAnsiChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PAnsiChar): integer; cdecl; external SQLiteDLL name 'sqlite3_prepare_v2';
function SQLite3_ColumnCount(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_column_count';
function SQLite3_ColumnName(hStmt: TSqliteStmt; ColNum: integer): PAnsiChar; cdecl; external SQLiteDLL name 'sqlite3_column_name';
function SQLite3_ColumnDeclType(hStmt: TSqliteStmt; ColNum: integer): PAnsiChar; cdecl; external SQLiteDLL name 'sqlite3_column_decltype';
function SQLite3_Step(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_step';
function SQLite3_DataCount(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_data_count';
function SQLite3_ColumnBlob(hStmt: TSqliteStmt; ColNum: integer): pointer; cdecl; external SQLiteDLL name 'sqlite3_column_blob';
function SQLite3_ColumnBytes(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_bytes';
function SQLite3_ColumnDouble(hStmt: TSqliteStmt; ColNum: integer): double; cdecl; external SQLiteDLL name 'sqlite3_column_double';
function SQLite3_ColumnInt(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_int';
function SQLite3_ColumnText(hStmt: TSqliteStmt; ColNum: integer): PAnsiChar; cdecl; external SQLiteDLL name 'sqlite3_column_text';
function SQLite3_ColumnType(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_column_type';
function SQLite3_ColumnInt64(hStmt: TSqliteStmt; ColNum: integer): Int64; cdecl; external SQLiteDLL name 'sqlite3_column_int64';
function SQLite3_Finalize(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_finalize';
function SQLite3_Reset(hStmt: TSqliteStmt): integer; cdecl; external SQLiteDLL name 'sqlite3_reset';
function SQLite3_Backup_Init(DestDb: TSQLiteDB; DestDbName: PAnsiChar; SourceDb: TSQLiteDB; SourceDbName: PAnsiChar): TSqliteBackup; cdecl; external SQLiteDLL name 'sqlite3_backup_init';
function SQLite3_Backup_Step(hBackup: TSQLiteBackup; nPage: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_backup_step';
function SQLite3_Backup_Finish(hBackup: TSQLiteBackup): integer; cdecl; external SQLiteDLL name 'sqlite3_backup_finish';
function SQLite3_Backup_Remaining(hBackup: TSQLiteBackup): integer; cdecl; external SQLiteDLL name 'sqlite3_backup_remaining';
function SQLite3_Backup_Pagecount(hBackup: TSQLiteBackup): integer; cdecl; external SQLiteDLL name 'sqlite3_backup_pagecount';
//
// In the SQL strings input to sqlite3_prepare() and sqlite3_prepare16(),
// one or more literals can be replace by a wildcard "?" or ":N:" where
// N is an integer.  These value of these wildcard literals can be set
// using the routines listed below.
//
// In every case, the first parameter is a pointer to the sqlite3_stmt
// structure returned from sqlite3_prepare().  The second parameter is the
// index of the wildcard.  The first "?" has an index of 1.  ":N:" wildcards
// use the index N.
//
// The fifth parameter to sqlite3_bind_blob(), sqlite3_bind_text(), and
//sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
//text after SQLite has finished with it.  If the fifth argument is the
// special value SQLITE_STATIC, then the library assumes that the information
// is in static, unmanaged space and does not need to be freed.  If the
// fifth argument has the value SQLITE_TRANSIENT, then SQLite makes its
// own private copy of the data.
//
// The sqlite3_bind_* routine must be called before sqlite3_step() after
// an sqlite3_prepare() or sqlite3_reset().  Unbound wildcards are interpreted
// as NULL.
//
type
  TSQLite3Destructor = procedure(Ptr: Pointer); cdecl;
function sqlite3_bind_blob(hStmt: TSqliteStmt; ParamNum: integer;
  ptrData: pointer; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
cdecl; external SQLiteDLL name 'sqlite3_bind_blob';
function sqlite3_bind_text(hStmt: TSqliteStmt; ParamNum: integer;
  Text: PAnsiChar; numBytes: integer; ptrDestructor: TSQLite3Destructor): integer;
cdecl; external SQLiteDLL name 'sqlite3_bind_text';
function sqlite3_bind_double(hStmt: TSqliteStmt; ParamNum: integer; Data: Double): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_double';
function sqlite3_bind_int(hStmt: TSqLiteStmt; ParamNum: integer; Data: integer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_int';
function sqlite3_bind_int64(hStmt: TSqliteStmt; ParamNum: integer; Data: int64): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_int64';
function sqlite3_bind_null(hStmt: TSqliteStmt; ParamNum: integer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_null';
function sqlite3_bind_parameter_index(hStmt: TSqliteStmt; zName: PAnsiChar): integer;
  cdecl; external SQLiteDLL name 'sqlite3_bind_parameter_index';
function sqlite3_enable_shared_cache(Value: integer): integer; cdecl; external SQLiteDLL name 'sqlite3_enable_shared_cache';
//user collate definiton
function SQLite3_create_collation(db: TSQLiteDB; Name: PAnsiChar; eTextRep: integer;
  UserData: pointer; xCompare: TCollateXCompare): integer; cdecl; external SQLiteDLL name 'sqlite3_create_collation';
function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
implementation
uses
  SysUtils;
function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
begin
  case SQLiteFieldTypeCode of
    SQLITE_INTEGER: Result := 'Integer';
    SQLITE_FLOAT: Result := 'Float';
    SQLITE_TEXT: Result := 'Text';
    SQLITE_BLOB: Result := 'Blob';
    SQLITE_NULL: Result := 'Null';
  else
    Result := 'Unknown SQLite Field Type Code "' + IntToStr(SQLiteFieldTypeCode) + '"';
  end;
end;
function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
begin
  case SQLiteErrorCode of
    SQLITE_OK: Result := 'Successful result';
    SQLITE_ERROR: Result := 'SQL error or missing database';
    SQLITE_INTERNAL: Result := 'An internal logic error in SQLite';
    SQLITE_PERM: Result := 'Access permission denied';
    SQLITE_ABORT: Result := 'Callback routine requested an abort';
    SQLITE_BUSY: Result := 'The database file is locked';
    SQLITE_LOCKED: Result := 'A table in the database is locked';
    SQLITE_NOMEM: Result := 'A malloc() failed';
    SQLITE_READONLY: Result := 'Attempt to write a readonly database';
    SQLITE_INTERRUPT: Result := 'Operation terminated by sqlite3_interrupt()';
    SQLITE_IOERR: Result := 'Some kind of disk I/O error occurred';
    SQLITE_CORRUPT: Result := 'The database disk image is malformed';
    SQLITE_NOTFOUND: Result := '(Internal Only) Table or record not found';
    SQLITE_FULL: Result := 'Insertion failed because database is full';
    SQLITE_CANTOPEN: Result := 'Unable to open the database file';
    SQLITE_PROTOCOL: Result := 'Database lock protocol error';
    SQLITE_EMPTY: Result := 'Database is empty';
    SQLITE_SCHEMA: Result := 'The database schema changed';
    SQLITE_TOOBIG: Result := 'Too much data for one row of a table';
    SQLITE_CONSTRAINT: Result := 'Abort due to contraint violation';
    SQLITE_MISMATCH: Result := 'Data type mismatch';
    SQLITE_MISUSE: Result := 'Library used incorrectly';
    SQLITE_NOLFS: Result := 'Uses OS features not supported on host';
    SQLITE_AUTH: Result := 'Authorization denied';
    SQLITE_FORMAT: Result := 'Auxiliary database format error';
    SQLITE_RANGE: Result := '2nd parameter to sqlite3_bind out of range';
    SQLITE_NOTADB: Result := 'File opened that is not a database file';
    SQLITE_ROW: Result := 'sqlite3_step() has another row ready';
    SQLITE_DONE: Result := 'sqlite3_step() has finished executing';
  else
    Result := 'Unknown SQLite Error Code "' + IntToStr(SQLiteErrorCode) + '"';
  end;
end;
function ColValueToStr(Value: PAnsiChar): AnsiString;
begin
  if (Value = nil) then
    Result := 'NULL'
  else
    Result := Value;
end;
end.
src/sqlite3/SQLiteTable3.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1513 @@
unit SQLiteTable3;
{
  Simple classes for using SQLite's exec and get_table.
  TSQLiteDatabase wraps the calls to open and close an SQLite database.
  It also wraps SQLite_exec for queries that do not return a result set
  TSQLiteTable wraps execution of SQL query.
  It run query and read all returned rows to internal buffer.
  It allows accessing fields by name as well as index and can move through a
  result set forward and backwards, or randomly to any row.
  TSQLiteUniTable wraps execution of SQL query.
  It run query as TSQLiteTable, but reading just first row only!
  You can step to next row (until not EOF) by 'Next' method.
  You cannot step backwards! (So, it is called as UniDirectional result set.)
  It not using any internal buffering, this class is very close to Sqlite API.
  It allows accessing fields by name as well as index on actual row only.
  Very good and fast for sequentional scanning of large result sets with minimal
    memory footprint.
  Warning! Do not close TSQLiteDatabase before any TSQLiteUniTable,
    because query is closed on TSQLiteUniTable destructor and database connection
    is used during TSQLiteUniTable live!
  SQL parameter usage:
    You can add named parameter values by call set of AddParam* methods.
    Parameters will be used for first next SQL statement only.
    Parameter name must be prefixed by ':', '$' or '@' and same prefix must be
    used in SQL statement!
    Sample:
      table.AddParamText(':str', 'some value');
      s := table.GetTableString('SELECT value FROM sometable WHERE id=:str');
   Notes from Andrew Retmanski on prepared queries
   The changes are as follows:
   SQLiteTable3.pas
   - Added new boolean property Synchronised (this controls the SYNCHRONOUS pragma as I found that turning this OFF increased the write performance in my application)
   - Added new type TSQLiteQuery (this is just a simple record wrapper around the SQL string and a TSQLiteStmt pointer)
   - Added PrepareSQL method to prepare SQL query - returns TSQLiteQuery
   - Added ReleaseSQL method to release previously prepared query
   - Added overloaded BindSQL methods for Integer and String types - these set new values for the prepared query parameters
   - Added overloaded ExecSQL method to execute a prepared TSQLiteQuery
   Usage of the new methods should be self explanatory but the process is in essence:
   1. Call PrepareSQL to return TSQLiteQuery 2. Call BindSQL for each parameter in the prepared query 3. Call ExecSQL to run the prepared query 4. Repeat steps 2 & 3 as required 5. Call ReleaseSQL to free SQLite resources
   One other point - the Synchronised property throws an error if used inside a transaction.
   Acknowledments
   Adapted by Tim Anderson (tim@itwriting.com)
   Originally created by Pablo Pissanetzky (pablo@myhtpc.net)
   Modified and enhanced by Lukas Gebauer
   Modified and enhanced by Tobias Gunkel
}
interface
{$IFDEF FPC}
  {$MODE Delphi}{$H+}
{$ENDIF}
uses
  {$IFDEF WIN32}
  Windows,
  {$ENDIF}
  SQLite3, Classes, SysUtils;
const
  dtInt = 1;
  dtNumeric = 2;
  dtStr = 3;
  dtBlob = 4;
  dtNull = 5;
type
  ESQLiteException = class(Exception)
  end;
  TSQliteParam = class
  public
    name: string;
    valuetype: integer;
    valueinteger: int64;
    valuefloat: double;
    valuedata: string;
  end;
  THookQuery = procedure(Sender: TObject; SQL: String) of object;
  TSQLiteQuery = record
    SQL: String;
    Statement: TSQLiteStmt;
  end;
  TSQLiteTable = class;
  TSQLiteUniTable = class;
  TSQLiteDatabase = class
  private
    fDB: TSQLiteDB;
    fInTrans: boolean;
    fSync: boolean;
    fParams: TList;
    FOnQuery: THookQuery;
    procedure RaiseError(s: string; SQL: string);
    procedure SetParams(Stmt: TSQLiteStmt);
    procedure BindData(Stmt: TSQLiteStmt; const Bindings: array of const);
    function GetRowsChanged: integer;
  protected
    procedure SetSynchronised(Value: boolean);
    procedure DoQuery(value: string);
  public
    constructor Create(const FileName: string);
    destructor Destroy; override;
    function GetTable(const SQL: Ansistring): TSQLiteTable; overload;
    function GetTable(const SQL: Ansistring; const Bindings: array of const): TSQLiteTable; overload;
    procedure ExecSQL(const SQL: Ansistring); overload;
    procedure ExecSQL(const SQL: Ansistring; const Bindings: array of const); overload;
    procedure ExecSQL(Query: TSQLiteQuery); overload;
    function PrepareSQL(const SQL: Ansistring): TSQLiteQuery;
    procedure BindSQL(Query: TSQLiteQuery; const Index: Integer; const Value: Integer); overload;
    procedure BindSQL(Query: TSQLiteQuery; const Index: Integer; const Value: String); overload;
    procedure ReleaseSQL(Query: TSQLiteQuery);
    function GetUniTable(const SQL: Ansistring): TSQLiteUniTable; overload;
    function GetUniTable(const SQL: Ansistring; const Bindings: array of const): TSQLiteUniTable; overload;
    function GetTableValue(const SQL: Ansistring): int64; overload;
    function GetTableValue(const SQL: Ansistring; const Bindings: array of const): int64; overload;
    function GetTableString(const SQL: Ansistring): string; overload;
    function GetTableString(const SQL: Ansistring; const Bindings: array of const): string; overload;
    procedure GetTableStrings(const SQL: Ansistring; const Value: TStrings);
    procedure UpdateBlob(const SQL: Ansistring; BlobData: TStream);
    procedure BeginTransaction;
    procedure Commit;
    procedure Rollback;
    function TableExists(TableName: string): boolean;
    function GetLastInsertRowID: int64;
    function GetLastChangedRows: int64;
    procedure SetTimeout(Value: integer);
    function Backup(TargetDB: TSQLiteDatabase): integer; Overload;
    function Backup(TargetDB: TSQLiteDatabase; targetName: Ansistring; sourceName: Ansistring): integer; Overload;
    function Version: string;
    procedure AddCustomCollate(name: string; xCompare: TCollateXCompare);
    //adds collate named SYSTEM for correct data sorting by user's locale
    Procedure AddSystemCollate;
    procedure ParamsClear;
    procedure AddParamInt(name: string; value: int64);
    procedure AddParamFloat(name: string; value: double);
    procedure AddParamText(name: string; value: string);
    procedure AddParamNull(name: string);
    property DB: TSQLiteDB read fDB;
  published
    property IsTransactionOpen: boolean read fInTrans;
    //database rows that were changed (or inserted or deleted) by the most recent SQL statement
    property RowsChanged : integer read getRowsChanged;
    property Synchronised: boolean read FSync write SetSynchronised;
    property OnQuery: THookQuery read FOnQuery write FOnQuery;
  end;
  TSQLiteTable = class
  private
    fResults: TList;
    fRowCount: cardinal;
    fColCount: cardinal;
    fCols: TStringList;
    fColTypes: TList;
    fRow: cardinal;
    function GetFields(I: cardinal): string;
    function GetEOF: boolean;
    function GetBOF: boolean;
    function GetColumns(I: integer): string;
    function GetFieldByName(FieldName: string): string;
    function GetFieldIndex(FieldName: string): integer;
    function GetCount: integer;
    function GetCountResult: integer;
  public
    constructor Create(DB: TSQLiteDatabase; const SQL: Ansistring); overload;
    constructor Create(DB: TSQLiteDatabase; const SQL: Ansistring; const Bindings: array of const); overload;
    destructor Destroy; override;
    function FieldAsInteger(I: cardinal): int64;
    function FieldAsBlob(I: cardinal): TMemoryStream;
    function FieldAsBlobText(I: cardinal): string;
    function FieldIsNull(I: cardinal): boolean;
    function FieldAsString(I: cardinal): string;
    function FieldAsDouble(I: cardinal): double;
    function Next: boolean;
    function Previous: boolean;
    property EOF: boolean read GetEOF;
    property BOF: boolean read GetBOF;
    property Fields[I: cardinal]: string read GetFields;
    property FieldByName[FieldName: string]: string read GetFieldByName;
    property FieldIndex[FieldName: string]: integer read GetFieldIndex;
    property Columns[I: integer]: string read GetColumns;
    property ColCount: cardinal read fColCount;
    property RowCount: cardinal read fRowCount;
    property Row: cardinal read fRow;
    function MoveFirst: boolean;
    function MoveLast: boolean;
    function MoveTo(position: cardinal): boolean;
    property Count: integer read GetCount;
    // The property CountResult is used when you execute count(*) queries.
    // It returns 0 if the result set is empty or the value of the
    // first field as an integer.
    property CountResult: integer read GetCountResult;
  end;
  TSQLiteUniTable = class
  private
    fColCount: cardinal;
    fCols: TStringList;
    fRow: cardinal;
    fEOF: boolean;
    fStmt: TSQLiteStmt;
    fDB: TSQLiteDatabase;
    fSQL: string;
    function GetFields(I: cardinal): string;
    function GetColumns(I: integer): string;
    function GetFieldByName(FieldName: string): string;
    function GetFieldIndex(FieldName: string): integer;
  public
    constructor Create(DB: TSQLiteDatabase; const SQL: Ansistring); overload;
    constructor Create(DB: TSQLiteDatabase; const SQL: Ansistring; const Bindings: array of const); overload;
    destructor Destroy; override;
    function FieldAsInteger(I: cardinal): int64;
    function FieldAsBlob(I: cardinal): TMemoryStream;
    function FieldAsBlobPtr(I: cardinal; out iNumBytes: integer): Pointer;
    function FieldAsBlobText(I: cardinal): string;
    function FieldIsNull(I: cardinal): boolean;
    function FieldAsString(I: cardinal): string;
    function FieldAsDouble(I: cardinal): double;
    function Next: boolean;
    property EOF: boolean read FEOF;
    property Fields[I: cardinal]: string read GetFields;
    property FieldByName[FieldName: string]: string read GetFieldByName;
    property FieldIndex[FieldName: string]: integer read GetFieldIndex;
    property Columns[I: integer]: string read GetColumns;
    property ColCount: cardinal read fColCount;
    property Row: cardinal read fRow;
  end;
procedure DisposePointer(ptr: pointer); cdecl;
{$IFDEF WIN32}
function SystemCollate(Userdta: pointer; Buf1Len: integer; Buf1: pointer;
    Buf2Len: integer; Buf2: pointer): integer; cdecl;
{$ENDIF}
implementation
procedure DisposePointer(ptr: pointer); cdecl;
begin
  if assigned(ptr) then
    freemem(ptr);
end;
{$IFDEF WIN32}
function SystemCollate(Userdta: pointer; Buf1Len: integer; Buf1: pointer;
    Buf2Len: integer; Buf2: pointer): integer; cdecl;
begin
  Result := CompareStringW(LOCALE_USER_DEFAULT, 0, PWideChar(Buf1), Buf1Len,
    PWideChar(Buf2), Buf2Len) - 2;
end;
{$ENDIF}
//------------------------------------------------------------------------------
// TSQLiteDatabase
//------------------------------------------------------------------------------
constructor TSQLiteDatabase.Create(const FileName: string);
var
  Msg: PAnsiChar;
  iResult: integer;
  utf8FileName: UTF8string;
begin
  inherited Create;
  fParams := TList.Create;
  self.fInTrans := False;
  Msg := nil;
  try
    utf8FileName := UTF8String(FileName);
    iResult := SQLite3_Open(PAnsiChar(utf8FileName), Fdb);
    if iResult <> SQLITE_OK then
      if Assigned(Fdb) then
      begin
        Msg := Sqlite3_ErrMsg(Fdb);
        raise ESqliteException.CreateFmt('Failed to open database "%s" : %s',
          [FileName, Msg]);
      end
      else
        raise ESqliteException.CreateFmt('Failed to open database "%s" : unknown error',
          [FileName]);
//set a few configs
//L.G. Do not call it here. Because busy handler is not setted here,
// any share violation causing exception!
//    self.ExecSQL('PRAGMA SYNCHRONOUS=NORMAL;');
//    self.ExecSQL('PRAGMA temp_store = MEMORY;');
  finally
    if Assigned(Msg) then
      SQLite3_Free(Msg);
  end;
end;
//..............................................................................
destructor TSQLiteDatabase.Destroy;
begin
  if self.fInTrans then
    self.Rollback;  //assume rollback
  if Assigned(fDB) then
    SQLite3_Close(fDB);
  ParamsClear;
  fParams.Free;
  inherited;
end;
function TSQLiteDatabase.GetLastInsertRowID: int64;
begin
  Result := Sqlite3_LastInsertRowID(self.fDB);
end;
function TSQLiteDatabase.GetLastChangedRows: int64;
begin
  Result := SQLite3_TotalChanges(self.fDB);
end;
//..............................................................................
procedure TSQLiteDatabase.RaiseError(s: string; SQL: string);
//look up last error and raise an exception with an appropriate message
var
  Msg: PAnsiChar;
  ret : integer;
begin
  Msg := nil;
  ret := sqlite3_errcode(self.fDB);
  if ret <> SQLITE_OK then
    Msg := sqlite3_errmsg(self.fDB);
  if Msg <> nil then
    raise ESqliteException.CreateFmt(s +'.'#13'Error [%d]: %s.'#13'"%s": %s', [ret, SQLiteErrorStr(ret),SQL, Msg])
  else
    raise ESqliteException.CreateFmt(s, [SQL, 'No message']);
end;
procedure TSQLiteDatabase.SetSynchronised(Value: boolean);
begin
  if Value <> fSync then
  begin
    if Value then
      ExecSQL('PRAGMA synchronous = ON;')
    else
      ExecSQL('PRAGMA synchronous = OFF;');
    fSync := Value;
  end;
end;
procedure TSQLiteDatabase.BindData(Stmt: TSQLiteStmt; const Bindings: array of const);
var
  BlobMemStream: TCustomMemoryStream;
  BlobStdStream: TStream;
  DataPtr: Pointer;
  DataSize: integer;
  AnsiStr: AnsiString;
  AnsiStrPtr: PAnsiString;
  I: integer;
begin
  for I := 0 to High(Bindings) do
  begin
    case Bindings[I].VType of
      vtString,
      vtAnsiString, vtPChar,
      vtWideString, vtPWideChar,
      vtChar, vtWideChar:
      begin
        case Bindings[I].VType of
          vtString: begin // ShortString
            AnsiStr := Bindings[I].VString^;
            DataPtr := PAnsiChar(AnsiStr);
            DataSize := Length(AnsiStr)+1;
          end;
          vtPChar: begin
            DataPtr := Bindings[I].VPChar;
            DataSize := -1;
          end;
          vtAnsiString: begin
            AnsiStrPtr := PAnsiString(@Bindings[I].VAnsiString);
            DataPtr := PAnsiChar(AnsiStrPtr^);
            DataSize := Length(AnsiStrPtr^)+1;
          end;
          vtPWideChar: begin
            DataPtr := PAnsiChar(UTF8Encode(WideString(Bindings[I].VPWideChar)));
            DataSize := -1;
          end;
          vtWideString: begin
            DataPtr := PAnsiChar(UTF8Encode(PWideString(@Bindings[I].VWideString)^));
            DataSize := -1;
          end;
          vtChar: begin
            DataPtr := PAnsiChar(String(Bindings[I].VChar));
            DataSize := 2;
          end;
          vtWideChar: begin
            DataPtr := PAnsiChar(UTF8Encode(WideString(Bindings[I].VWideChar)));
            DataSize := -1;
          end;
          else
            raise ESqliteException.Create('Unknown string-type');
        end;
        if (sqlite3_bind_text(Stmt, I+1, DataPtr, DataSize, SQLITE_STATIC) <> SQLITE_OK) then
          RaiseError('Could not bind text', 'BindData');
      end;
      vtInteger:
        if (sqlite3_bind_int(Stmt, I+1, Bindings[I].VInteger) <> SQLITE_OK) then
          RaiseError('Could not bind integer', 'BindData');
      vtInt64:
        if (sqlite3_bind_int64(Stmt, I+1, Bindings[I].VInt64^) <> SQLITE_OK) then
          RaiseError('Could not bind int64', 'BindData');
      vtExtended:
        if (sqlite3_bind_double(Stmt, I+1, Bindings[I].VExtended^) <> SQLITE_OK) then
          RaiseError('Could not bind extended', 'BindData');
      vtBoolean:
        if (sqlite3_bind_int(Stmt, I+1, Integer(Bindings[I].VBoolean)) <> SQLITE_OK) then
          RaiseError('Could not bind boolean', 'BindData');
      vtPointer:
      begin
        if (Bindings[I].VPointer = nil) then
        begin
          if (sqlite3_bind_null(Stmt, I+1) <> SQLITE_OK) then
            RaiseError('Could not bind null', 'BindData');
        end
        else
          raise ESqliteException.Create('Unhandled pointer (<> nil)');
      end;
      vtObject:
      begin
        if (Bindings[I].VObject is TCustomMemoryStream) then
        begin
          BlobMemStream := TCustomMemoryStream(Bindings[I].VObject);
          if (sqlite3_bind_blob(Stmt, I+1, @PAnsiChar(BlobMemStream.Memory)[BlobMemStream.Position],
              BlobMemStream.Size-BlobMemStream.Position, SQLITE_STATIC) <> SQLITE_OK) then
          begin
            RaiseError('Could not bind BLOB', 'BindData');
          end;
        end
        else if (Bindings[I].VObject is TStream) then
        begin
          BlobStdStream := TStream(Bindings[I].VObject);
          DataSize := BlobStdStream.Size;
          GetMem(DataPtr, DataSize);
          if (DataPtr = nil) then
            raise ESqliteException.Create('Error getting memory to save blob');
          BlobStdStream.Position := 0;
          BlobStdStream.Read(DataPtr^, DataSize);
          if (sqlite3_bind_blob(stmt, I+1, DataPtr, DataSize, @DisposePointer) <> SQLITE_OK) then
            RaiseError('Could not bind BLOB', 'BindData');
        end
        else
          raise ESqliteException.Create('Unhandled object-type in binding');
      end
      else
      begin
        raise ESqliteException.Create('Unhandled binding');
      end;
    end;
  end;
end;
procedure TSQLiteDatabase.ExecSQL(const SQL: Ansistring);
begin
  ExecSQL(SQL, []);
end;
procedure TSQLiteDatabase.ExecSQL(const SQL: Ansistring; const Bindings: array of const);
var
  Stmt: TSQLiteStmt;
  NextSQLStatement: PAnsiChar;
  iStepResult: integer;
begin
  try
    if Sqlite3_Prepare_v2(self.fDB, PAnsiChar(SQL), -1, Stmt, NextSQLStatement) <>
      SQLITE_OK then
      RaiseError('Error executing SQL', SQL);
    if (Stmt = nil) then
      RaiseError('Could not prepare SQL statement', SQL);
    DoQuery(SQL);
    SetParams(Stmt);
    BindData(Stmt, Bindings);
    iStepResult := Sqlite3_step(Stmt);
    if (iStepResult <> SQLITE_DONE) then
      begin
      SQLite3_reset(stmt);
      RaiseError('Error executing SQL statement', SQL);
      end;
  finally
    if Assigned(Stmt) then
      Sqlite3_Finalize(stmt);
  end;
end;
{$WARNINGS OFF}
procedure TSQLiteDatabase.ExecSQL(Query: TSQLiteQuery);
var
  iStepResult: integer;
begin
  if Assigned(Query.Statement) then
  begin
    iStepResult := Sqlite3_step(Query.Statement);
    if (iStepResult <> SQLITE_DONE) then
      begin
      SQLite3_reset(Query.Statement);
      RaiseError('Error executing prepared SQL statement', Query.SQL);
      end;
    Sqlite3_Reset(Query.Statement);
  end;
end;
{$WARNINGS ON}
{$WARNINGS OFF}
function TSQLiteDatabase.PrepareSQL(const SQL: Ansistring): TSQLiteQuery;
var
  Stmt: TSQLiteStmt;
  NextSQLStatement: PAnsiChar;
begin
  Result.SQL := SQL;
  Result.Statement := nil;
  if Sqlite3_Prepare(self.fDB, PAnsiChar(SQL), -1, Stmt, NextSQLStatement) <>
    SQLITE_OK then
    RaiseError('Error executing SQL', SQL)
  else
    Result.Statement := Stmt;
  if (Result.Statement = nil) then
    RaiseError('Could not prepare SQL statement', SQL);
  DoQuery(SQL);
end;
{$WARNINGS ON}
{$WARNINGS OFF}
procedure TSQLiteDatabase.BindSQL(Query: TSQLiteQuery; const Index: Integer; const Value: Integer);
begin
  if Assigned(Query.Statement) then
    sqlite3_Bind_Int(Query.Statement, Index, Value)
  else
    RaiseError('Could not bind integer to prepared SQL statement', Query.SQL);
end;
{$WARNINGS ON}
{$WARNINGS OFF}
procedure TSQLiteDatabase.BindSQL(Query: TSQLiteQuery; const Index: Integer; const Value: String);
begin
  if Assigned(Query.Statement) then
    Sqlite3_Bind_Text(Query.Statement, Index, PAnsiChar(Value), Length(Value), Pointer(SQLITE_STATIC))
  else
    RaiseError('Could not bind string to prepared SQL statement', Query.SQL);
end;
{$WARNINGS ON}
{$WARNINGS OFF}
procedure TSQLiteDatabase.ReleaseSQL(Query: TSQLiteQuery);
begin
  if Assigned(Query.Statement) then
  begin
    Sqlite3_Finalize(Query.Statement);
    Query.Statement := nil;
  end
  else
    RaiseError('Could not release prepared SQL statement', Query.SQL);
end;
{$WARNINGS ON}
procedure TSQLiteDatabase.UpdateBlob(const SQL: Ansistring; BlobData: TStream);
var
  iSize: integer;
  ptr: pointer;
  Stmt: TSQLiteStmt;
  Msg: PAnsiChar;
  NextSQLStatement: PAnsiChar;
  iStepResult: integer;
  iBindResult: integer;
begin
  //expects SQL of the form 'UPDATE MYTABLE SET MYFIELD = ? WHERE MYKEY = 1'
  if pos('?', SQL) = 0 then
    RaiseError('SQL must include a ? parameter', SQL);
  Msg := nil;
  try
    if Sqlite3_Prepare_v2(self.fDB, PAnsiChar(SQL), -1, Stmt, NextSQLStatement) <>
      SQLITE_OK then
      RaiseError('Could not prepare SQL statement', SQL);
    if (Stmt = nil) then
      RaiseError('Could not prepare SQL statement', SQL);
    DoQuery(SQL);
    //now bind the blob data
    iSize := BlobData.size;
    GetMem(ptr, iSize);
    if (ptr = nil) then
      raise ESqliteException.CreateFmt('Error getting memory to save blob',
        [SQL, 'Error']);
    BlobData.position := 0;
    BlobData.Read(ptr^, iSize);
    iBindResult := SQLite3_Bind_Blob(stmt, 1, ptr, iSize, @DisposePointer);
    if iBindResult <> SQLITE_OK then
      RaiseError('Error binding blob to database', SQL);
    iStepResult := Sqlite3_step(Stmt);
    if (iStepResult <> SQLITE_DONE) then
      begin
      SQLite3_reset(stmt);
      RaiseError('Error executing SQL statement', SQL);
      end;
  finally
    if Assigned(Stmt) then
      Sqlite3_Finalize(stmt);
    if Assigned(Msg) then
      SQLite3_Free(Msg);
  end;
end;
//..............................................................................
function TSQLiteDatabase.GetTable(const SQL: Ansistring): TSQLiteTable;
begin
  Result := TSQLiteTable.Create(Self, SQL);
end;
function TSQLiteDatabase.GetTable(const SQL: Ansistring; const Bindings: array of const): TSQLiteTable;
begin
  Result := TSQLiteTable.Create(Self, SQL, Bindings);
end;
function TSQLiteDatabase.GetUniTable(const SQL: Ansistring): TSQLiteUniTable;
begin
  Result := TSQLiteUniTable.Create(Self, SQL);
end;
function TSQLiteDatabase.GetUniTable(const SQL: Ansistring; const Bindings: array of const): TSQLiteUniTable;
begin
  Result := TSQLiteUniTable.Create(Self, SQL, Bindings);
end;
function TSQLiteDatabase.GetTableValue(const SQL: Ansistring): int64;
begin
  Result := GetTableValue(SQL, []);
end;
function TSQLiteDatabase.GetTableValue(const SQL: Ansistring; const Bindings: array of const): int64;
var
  Table: TSQLiteUniTable;
begin
  Result := 0;
  Table := self.GetUniTable(SQL, Bindings);
  try
    if not Table.EOF then
      Result := Table.FieldAsInteger(0);
  finally
    Table.Free;
  end;
end;
function TSQLiteDatabase.GetTableString(const SQL: Ansistring): String;
begin
  Result := GetTableString(SQL, []);
end;
function TSQLiteDatabase.GetTableString(const SQL: Ansistring; const Bindings: array of const): String;
var
  Table: TSQLiteUniTable;
begin
  Result := '';
  Table := self.GetUniTable(SQL, Bindings);
  try
    if not Table.EOF then
      Result := Table.FieldAsString(0);
  finally
    Table.Free;
  end;
end;
procedure TSQLiteDatabase.GetTableStrings(const SQL: Ansistring;
  const Value: TStrings);
var
  Table: TSQLiteUniTable;
begin
  Value.Clear;
  Table := self.GetUniTable(SQL);
  try
    while not table.EOF do
    begin
      Value.Add(Table.FieldAsString(0));
      table.Next;
    end;
  finally
    Table.Free;
  end;
end;
procedure TSQLiteDatabase.BeginTransaction;
begin
  if not self.fInTrans then
  begin
    self.ExecSQL('BEGIN TRANSACTION');
    self.fInTrans := True;
  end
  else
    raise ESqliteException.Create('Transaction already open');
end;
procedure TSQLiteDatabase.Commit;
begin
  self.ExecSQL('COMMIT');
  self.fInTrans := False;
end;
procedure TSQLiteDatabase.Rollback;
begin
  self.ExecSQL('ROLLBACK');
  self.fInTrans := False;
end;
function TSQLiteDatabase.TableExists(TableName: string): boolean;
var
  sql: string;
  ds: TSqliteTable;
begin
  //returns true if table exists in the database
  sql := 'select [sql] from sqlite_master where [type] = ''table'' and lower(name) = ''' +
    lowercase(TableName) + ''' ';
  ds := self.GetTable(sql);
  try
    Result := (ds.Count > 0);
  finally
    ds.Free;
  end;
end;
procedure TSQLiteDatabase.SetTimeout(Value: integer);
begin
  SQLite3_BusyTimeout(self.fDB, Value);
end;
function TSQLiteDatabase.Version: string;
begin
  Result := SQLite3_Version;
end;
procedure TSQLiteDatabase.AddCustomCollate(name: string;
  xCompare: TCollateXCompare);
begin
  sqlite3_create_collation(fdb, PAnsiChar(name), SQLITE_UTF8, nil, xCompare);
end;
procedure TSQLiteDatabase.AddSystemCollate;
begin
  {$IFDEF WIN32}
  sqlite3_create_collation(fdb, 'SYSTEM', SQLITE_UTF16LE, nil, @SystemCollate);
  {$ENDIF}
end;
procedure TSQLiteDatabase.ParamsClear;
var
  n: integer;
begin
  for n := fParams.Count - 1 downto 0 do
    TSQliteParam(fparams[n]).free;
  fParams.Clear;
end;
procedure TSQLiteDatabase.AddParamInt(name: string; value: int64);
var
  par: TSQliteParam;
begin
  par := TSQliteParam.Create;
  par.name := name;
  par.valuetype := SQLITE_INTEGER;
  par.valueinteger := value;
  fParams.Add(par);
end;
procedure TSQLiteDatabase.AddParamFloat(name: string; value: double);
var
  par: TSQliteParam;
begin
  par := TSQliteParam.Create;
  par.name := name;
  par.valuetype := SQLITE_FLOAT;
  par.valuefloat := value;
  fParams.Add(par);
end;
procedure TSQLiteDatabase.AddParamText(name: string; value: string);
var
  par: TSQliteParam;
begin
  par := TSQliteParam.Create;
  par.name := name;
  par.valuetype := SQLITE_TEXT;
  par.valuedata := value;
  fParams.Add(par);
end;
procedure TSQLiteDatabase.AddParamNull(name: string);
var
  par: TSQliteParam;
begin
  par := TSQliteParam.Create;
  par.name := name;
  par.valuetype := SQLITE_NULL;
  fParams.Add(par);
end;
procedure TSQLiteDatabase.SetParams(Stmt: TSQLiteStmt);
var
  n: integer;
  i: integer;
  par: TSQliteParam;
begin
  try
    for n := 0 to fParams.Count - 1 do
    begin
      par := TSQliteParam(fParams[n]);
      i := sqlite3_bind_parameter_index(Stmt, PAnsiChar(par.name));
      if i > 0 then
      begin
        case par.valuetype of
          SQLITE_INTEGER:
            sqlite3_bind_int64(Stmt, i, par.valueinteger);
          SQLITE_FLOAT:
            sqlite3_bind_double(Stmt, i, par.valuefloat);
          SQLITE_TEXT:
            sqlite3_bind_text(Stmt, i, PAnsiChar(par.valuedata),
              length(par.valuedata), SQLITE_TRANSIENT);
          SQLITE_NULL:
            sqlite3_bind_null(Stmt, i);
        end;
      end;
    end;
  finally
    ParamsClear;
  end;
end;
//database rows that were changed (or inserted or deleted) by the most recent SQL statement
function TSQLiteDatabase.GetRowsChanged: integer;
begin
 Result := SQLite3_Changes(self.fDB);
end;
procedure TSQLiteDatabase.DoQuery(value: string);
begin
  if assigned(OnQuery) then
    OnQuery(Self, Value);
end;
//returns result of SQLITE3_Backup_Step
function TSQLiteDatabase.Backup(TargetDB: TSQLiteDatabase; targetName: Ansistring; sourceName: Ansistring): integer;
var
pBackup: TSQLiteBackup;
begin
 pBackup := Sqlite3_backup_init(TargetDB.DB,PAnsiChar(targetName),self.DB,PAnsiChar(sourceName));
 if (pBackup = nil) then
 raise ESqliteException.Create('Could not initialize backup')
 else begin
      try
      result := SQLITE3_Backup_Step(pBackup,-1); //copies entire db
      finally
      SQLITE3_backup_finish(pBackup);
      end;
 end;
end;
function TSQliteDatabase.Backup(TargetDB: TSQLiteDatabase): integer;
begin
  result := self.Backup(TargetDB,'main','main');
end;
//------------------------------------------------------------------------------
// TSQLiteTable
//------------------------------------------------------------------------------
constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring);
begin
  Create(DB, SQL, []);
end;
constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring; const Bindings: array of const);
var
  Stmt: TSQLiteStmt;
  NextSQLStatement: PAnsiChar;
  iStepResult: integer;
  ptr: pointer;
  iNumBytes: integer;
  thisBlobValue: TMemoryStream;
  thisStringValue: pstring;
  thisDoubleValue: pDouble;
  thisIntValue: pInt64;
  thisColType: pInteger;
  i: integer;
  DeclaredColType: PAnsiChar;
  ActualColType: integer;
  ptrValue: PAnsiChar;
begin
  inherited create;
  try
    self.fRowCount := 0;
    self.fColCount := 0;
    //if there are several SQL statements in SQL, NextSQLStatment points to the
    //beginning of the next one. Prepare only prepares the first SQL statement.
    if Sqlite3_Prepare_v2(DB.fDB, PAnsiChar(SQL), -1, Stmt, NextSQLStatement) <> SQLITE_OK then
      DB.RaiseError('Error executing SQL', SQL);
    if (Stmt = nil) then
      DB.RaiseError('Could not prepare SQL statement', SQL);
    DB.DoQuery(SQL);
    DB.SetParams(Stmt);
    DB.BindData(Stmt, Bindings);
    iStepResult := Sqlite3_step(Stmt);
    while (iStepResult <> SQLITE_DONE) do
    begin
      case iStepResult of
        SQLITE_ROW:
          begin
            Inc(fRowCount);
            if (fRowCount = 1) then
            begin
            //get data types
              fCols := TStringList.Create;
              fColTypes := TList.Create;
              fColCount := SQLite3_ColumnCount(stmt);
              for i := 0 to Pred(fColCount) do
                fCols.Add(AnsiUpperCase(Sqlite3_ColumnName(stmt, i)));
              for i := 0 to Pred(fColCount) do
              begin
                new(thisColType);
                DeclaredColType := Sqlite3_ColumnDeclType(stmt, i);
                if DeclaredColType = nil then
                  thisColType^ := Sqlite3_ColumnType(stmt, i) //use the actual column type instead
                //seems to be needed for last_insert_rowid
                else
                  if (DeclaredColType = 'INTEGER') or (DeclaredColType = 'BOOLEAN') then
                    thisColType^ := dtInt
                  else
                    if (DeclaredColType = 'NUMERIC') or
                      (DeclaredColType = 'FLOAT') or
                      (DeclaredColType = 'DOUBLE') or
                      (DeclaredColType = 'REAL') then
                      thisColType^ := dtNumeric
                    else
                      if DeclaredColType = 'BLOB' then
                        thisColType^ := dtBlob
                      else
                        thisColType^ := dtStr;
                fColTypes.Add(thiscoltype);
              end;
              fResults := TList.Create;
            end;
          //get column values
            for i := 0 to Pred(ColCount) do
            begin
              ActualColType := Sqlite3_ColumnType(stmt, i);
              if (ActualColType = SQLITE_NULL) then
                fResults.Add(nil)
              else
                if pInteger(fColTypes[i])^ = dtInt then
                begin
                  new(thisintvalue);
                  thisintvalue^ := Sqlite3_ColumnInt64(stmt, i);
                  fResults.Add(thisintvalue);
                end
                else
                  if pInteger(fColTypes[i])^ = dtNumeric then
                  begin
                    new(thisdoublevalue);
                    thisdoublevalue^ := Sqlite3_ColumnDouble(stmt, i);
                    fResults.Add(thisdoublevalue);
                  end
                  else
                    if pInteger(fColTypes[i])^ = dtBlob then
                    begin
                      iNumBytes := Sqlite3_ColumnBytes(stmt, i);
                      if iNumBytes = 0 then
                        thisblobvalue := nil
                      else
                      begin
                        thisblobvalue := TMemoryStream.Create;
                        thisblobvalue.position := 0;
                        ptr := Sqlite3_ColumnBlob(stmt, i);
                        thisblobvalue.writebuffer(ptr^, iNumBytes);
                      end;
                      fResults.Add(thisblobvalue);
                    end
                    else
                    begin
                      new(thisstringvalue);
                      ptrValue := Sqlite3_ColumnText(stmt, i);
                      setstring(thisstringvalue^, ptrvalue, strlen(ptrvalue));
                      fResults.Add(thisstringvalue);
                    end;
            end;
          end;
        SQLITE_BUSY:
          raise ESqliteException.CreateFmt('Could not prepare SQL statement',
            [SQL, 'SQLite is Busy']);
      else
        begin
        SQLite3_reset(stmt);
        DB.RaiseError('Could not retrieve data', SQL);
        end;
      end;
      iStepResult := Sqlite3_step(Stmt);
    end;
    fRow := 0;
  finally
    if Assigned(Stmt) then
      Sqlite3_Finalize(stmt);
  end;
end;
//..............................................................................
destructor TSQLiteTable.Destroy;
var
  i: cardinal;
  iColNo: integer;
begin
  if Assigned(fResults) then
  begin
    for i := 0 to fResults.Count - 1 do
    begin
      //check for blob type
      iColNo := (i mod fColCount);
      case pInteger(self.fColTypes[iColNo])^ of
        dtBlob:
          TMemoryStream(fResults[i]).Free;
        dtStr:
          if fResults[i] <> nil then
          begin
            setstring(string(fResults[i]^), nil, 0);
            dispose(fResults[i]);
          end;
      else
        dispose(fResults[i]);
      end;
    end;
    fResults.Free;
  end;
  if Assigned(fCols) then
    fCols.Free;
  if Assigned(fColTypes) then
    for i := 0 to fColTypes.Count - 1 do
      dispose(fColTypes[i]);
  fColTypes.Free;
  inherited;
end;
//..............................................................................
function TSQLiteTable.GetColumns(I: integer): string;
begin
  Result := fCols[I];
end;
//..............................................................................
function TSQLiteTable.GetCountResult: integer;
begin
  if not EOF then
    Result := StrToInt(Fields[0])
  else
    Result := 0;
end;
function TSQLiteTable.GetCount: integer;
begin
  Result := FRowCount;
end;
//..............................................................................
function TSQLiteTable.GetEOF: boolean;
begin
  Result := fRow >= fRowCount;
end;
function TSQLiteTable.GetBOF: boolean;
begin
  Result := fRow <= 0;
end;
//..............................................................................
function TSQLiteTable.GetFieldByName(FieldName: string): string;
begin
  Result := GetFields(self.GetFieldIndex(FieldName));
end;
function TSQLiteTable.GetFieldIndex(FieldName: string): integer;
begin
  if (fCols = nil) then
  begin
    raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
    exit;
  end;
  if (fCols.count = 0) then
  begin
    raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
    exit;
  end;
  Result := fCols.IndexOf(AnsiUpperCase(FieldName));
  if (result < 0) then
  begin
    raise ESqliteException.Create('Field not found in dataset: ' + fieldname)
  end;
end;
//..............................................................................
function TSQLiteTable.GetFields(I: cardinal): string;
var
  thisvalue: pstring;
  thistype: integer;
begin
  Result := '';
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  //integer types are not stored in the resultset
  //as strings, so they should be retrieved using the type-specific
  //methods
  thistype := pInteger(self.fColTypes[I])^;
  case thistype of
    dtStr:
      begin
        thisvalue := self.fResults[(self.frow * self.fColCount) + I];
        if (thisvalue <> nil) then
          Result := thisvalue^
        else
          Result := '';
      end;
    dtInt:
      Result := IntToStr(self.FieldAsInteger(I));
    dtNumeric:
      Result := FloatToStr(self.FieldAsDouble(I));
    dtBlob:
      Result := self.FieldAsBlobText(I);
  else
    Result := '';
  end;
end;
function TSqliteTable.FieldAsBlob(I: cardinal): TMemoryStream;
begin
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
    Result := nil
  else
    if pInteger(self.fColTypes[I])^ = dtBlob then
      Result := TMemoryStream(self.fResults[(self.frow * self.fColCount) + I])
    else
      raise ESqliteException.Create('Not a Blob field');
end;
function TSqliteTable.FieldAsBlobText(I: cardinal): string;
var
  MemStream: TMemoryStream;
  Buffer: PAnsiChar;
begin
  Result := '';
  MemStream := self.FieldAsBlob(I);
  if MemStream <> nil then
    if MemStream.Size > 0 then
      begin
        MemStream.position := 0;
        {$IFDEF UNICODE}
        Buffer := AnsiStralloc(MemStream.Size + 1);
        {$ELSE}
        Buffer := Stralloc(MemStream.Size + 1);
        {$ENDIF}
        MemStream.readbuffer(Buffer[0], MemStream.Size);
        (Buffer + MemStream.Size)^ := chr(0);
        SetString(Result, Buffer, MemStream.size);
        strdispose(Buffer);
      end;
     //do not free the TMemoryStream here; it is freed when
     //TSqliteTable is destroyed
end;
function TSqliteTable.FieldAsInteger(I: cardinal): int64;
begin
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
    Result := 0
  else
    if pInteger(self.fColTypes[I])^ = dtInt then
      Result := pInt64(self.fResults[(self.frow * self.fColCount) + I])^
    else
      if pInteger(self.fColTypes[I])^ = dtNumeric then
        Result := trunc(strtofloat(pString(self.fResults[(self.frow * self.fColCount) + I])^))
      else
        raise ESqliteException.Create('Not an integer or numeric field');
end;
function TSqliteTable.FieldAsDouble(I: cardinal): double;
begin
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
    Result := 0
  else
    if pInteger(self.fColTypes[I])^ = dtInt then
      Result := pInt64(self.fResults[(self.frow * self.fColCount) + I])^
    else
      if pInteger(self.fColTypes[I])^ = dtNumeric then
        Result := pDouble(self.fResults[(self.frow * self.fColCount) + I])^
      else
        raise ESqliteException.Create('Not an integer or numeric field');
end;
function TSqliteTable.FieldAsString(I: cardinal): string;
begin
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
    Result := ''
  else
    Result := self.GetFields(I);
end;
function TSqliteTable.FieldIsNull(I: cardinal): boolean;
var
  thisvalue: pointer;
begin
  if EOF then
    raise ESqliteException.Create('Table is at End of File');
  thisvalue := self.fResults[(self.frow * self.fColCount) + I];
  Result := (thisvalue = nil);
end;
//..............................................................................
function TSQLiteTable.Next: boolean;
begin
  Result := False;
  if not EOF then
  begin
    Inc(fRow);
    Result := True;
  end;
end;
function TSQLiteTable.Previous: boolean;
begin
  Result := False;
  if not BOF then
  begin
    Dec(fRow);
    Result := True;
  end;
end;
function TSQLiteTable.MoveFirst: boolean;
begin
  Result := False;
  if self.fRowCount > 0 then
  begin
    fRow := 0;
    Result := True;
  end;
end;
function TSQLiteTable.MoveLast: boolean;
begin
  Result := False;
  if self.fRowCount > 0 then
  begin
    fRow := fRowCount - 1;
    Result := True;
  end;
end;
{$WARNINGS OFF}
function TSQLiteTable.MoveTo(position: cardinal): boolean;
begin
  Result := False;
  if (self.fRowCount > 0) and (self.fRowCount > position) then
  begin
    fRow := position;
    Result := True;
  end;
end;
{$WARNINGS ON}
{ TSQLiteUniTable }
constructor TSQLiteUniTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring);
begin
  Create(DB, SQL, []);
end;
constructor TSQLiteUniTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring; const Bindings: array of const);
var
  NextSQLStatement: PAnsiChar;
  i: integer;
begin
  inherited create;
  self.fDB := db;
  self.fEOF := false;
  self.fRow := 0;
  self.fColCount := 0;
  self.fSQL := SQL;
  if Sqlite3_Prepare_v2(DB.fDB, PAnsiChar(SQL), -1, fStmt, NextSQLStatement) <> SQLITE_OK then
    DB.RaiseError('Error executing SQL', SQL);
  if (fStmt = nil) then
    DB.RaiseError('Could not prepare SQL statement', SQL);
  DB.DoQuery(SQL);
  DB.SetParams(fStmt);
  DB.BindData(fStmt, Bindings);
  //get data types
  fCols := TStringList.Create;
  fColCount := SQLite3_ColumnCount(fstmt);
  for i := 0 to Pred(fColCount) do
    fCols.Add(AnsiUpperCase(Sqlite3_ColumnName(fstmt, i)));
  Next;
end;
destructor TSQLiteUniTable.Destroy;
begin
  if Assigned(fStmt) then
    Sqlite3_Finalize(fstmt);
  if Assigned(fCols) then
    fCols.Free;
  inherited;
end;
function TSQLiteUniTable.FieldAsBlob(I: cardinal): TMemoryStream;
var
  iNumBytes: integer;
  ptr: pointer;
begin
  Result := TMemoryStream.Create;
  iNumBytes := Sqlite3_ColumnBytes(fstmt, i);
  if iNumBytes > 0 then
  begin
    ptr := Sqlite3_ColumnBlob(fstmt, i);
    Result.writebuffer(ptr^, iNumBytes);
    Result.Position := 0;
  end;
end;
function TSQLiteUniTable.FieldAsBlobPtr(I: cardinal; out iNumBytes: integer): Pointer;
begin
  iNumBytes := Sqlite3_ColumnBytes(fstmt, i);
  Result := Sqlite3_ColumnBlob(fstmt, i);
end;
function TSQLiteUniTable.FieldAsBlobText(I: cardinal): string;
var
  MemStream: TMemoryStream;
  Buffer: PAnsiChar;
begin
  Result := '';
  MemStream := self.FieldAsBlob(I);
  if MemStream <> nil then
     try
      if MemStream.Size > 0 then
      begin
        MemStream.position := 0;
        {$IFDEF UNICODE}
        Buffer := AnsiStralloc(MemStream.Size + 1);
        {$ELSE}
        Buffer := Stralloc(MemStream.Size + 1);
        {$ENDIF}
        MemStream.readbuffer(Buffer[0], MemStream.Size);
        (Buffer + MemStream.Size)^ := chr(0);
        SetString(Result, Buffer, MemStream.size);
        strdispose(Buffer);
      end;
     finally
     MemStream.Free;
     end
end;
function TSQLiteUniTable.FieldAsDouble(I: cardinal): double;
begin
  Result := Sqlite3_ColumnDouble(fstmt, i);
end;
function TSQLiteUniTable.FieldAsInteger(I: cardinal): int64;
begin
  Result := Sqlite3_ColumnInt64(fstmt, i);
end;
function TSQLiteUniTable.FieldAsString(I: cardinal): string;
begin
  Result := self.GetFields(I);
end;
function TSQLiteUniTable.FieldIsNull(I: cardinal): boolean;
begin
  Result := Sqlite3_ColumnText(fstmt, i) = nil;
end;
function TSQLiteUniTable.GetColumns(I: integer): string;
begin
  Result := fCols[I];
end;
function TSQLiteUniTable.GetFieldByName(FieldName: string): string;
begin
  Result := GetFields(self.GetFieldIndex(FieldName));
end;
function TSQLiteUniTable.GetFieldIndex(FieldName: string): integer;
begin
  if (fCols = nil) then
  begin
    raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
    exit;
  end;
  if (fCols.count = 0) then
  begin
    raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
    exit;
  end;
  Result := fCols.IndexOf(AnsiUpperCase(FieldName));
  if (result < 0) then
  begin
    raise ESqliteException.Create('Field not found in dataset: ' + fieldname)
  end;
end;
function TSQLiteUniTable.GetFields(I: cardinal): string;
begin
  Result := Sqlite3_ColumnText(fstmt, i);
end;
function TSQLiteUniTable.Next: boolean;
var
  iStepResult: integer;
begin
  fEOF := true;
  iStepResult := Sqlite3_step(fStmt);
  case iStepResult of
    SQLITE_ROW:
      begin
        fEOF := false;
        inc(fRow);
      end;
    SQLITE_DONE:
      // we are on the end of dataset
      // return EOF=true only
      ;
  else
    begin
    SQLite3_reset(fStmt);
    fDB.RaiseError('Could not retrieve data', fSQL);
    end;
  end;
  Result := not fEOF;
end;
end.
src/sqlite3/sqlite3udf.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
{
UDF Sqlite3 support v1.0.0
  translation to Pascal by Lukas Gebauer
This is experimental translation. Be patient!
}
unit sqlite3udf;
interface
uses
  sqlite3;
type
  Psqlite3_context = pointer;
  Psqlite3_value = ppchar;
  TxFunc = procedure(sqlite3_context: Psqlite3_context; cArg: integer; ArgV: Psqlite3_value);
  TxStep = procedure(sqlite3_context: Psqlite3_context; cArg: integer; ArgV: Psqlite3_value);
  TxFinal = procedure(sqlite3_context: Psqlite3_context);
{
  void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
  void (*xStep)(sqlite3_context*,int,sqlite3_value**),
  void (*xFinal)(sqlite3_context*)
}
//UDF SQLITE3 support
function sqlite3_create_function(db: TSQLiteDB; functionName: PChar; nArg: integer;
  eTextRep: integer; pUserdata: pointer; xFunc: TxFunc; xStep: TxStep; xFinal: TxFinal
  ): integer; cdecl; external SQLiteDLL name 'sqlite3_create_function';
procedure sqlite3_result_blob(sqlite3_context: Psqlite3_context; value: Pointer;
  n: integer; destroy: pointer); cdecl; external SQLiteDLL name 'sqlite3_result_blob';
procedure sqlite3_result_double(sqlite3_context: Psqlite3_context; value: Double);
  cdecl; external SQLiteDLL name 'sqlite3_result_double';
procedure sqlite3_result_error(sqlite3_context: Psqlite3_context; value: Pchar;
  n: integer); cdecl; external SQLiteDLL name 'sqlite3_result_error';
procedure sqlite3_result_error16(sqlite3_context: Psqlite3_context; value: PWidechar;
  n: integer); cdecl; external SQLiteDLL name 'sqlite3_result_error16';
procedure sqlite3_result_int(sqlite3_context: Psqlite3_context; value: integer);
  cdecl; external SQLiteDLL name 'sqlite3_result_int';
procedure sqlite3_result_int64(sqlite3_context: Psqlite3_context; value: int64);
  cdecl; external SQLiteDLL name 'sqlite3_result_int64';
procedure sqlite3_result_null(sqlite3_context: Psqlite3_context);
  cdecl; external SQLiteDLL name 'sqlite3_result_null';
procedure sqlite3_result_text(sqlite3_context: Psqlite3_context; value: PChar;
  n: integer; destroy: pointer); cdecl; external SQLiteDLL name 'sqlite3_result_text';
procedure sqlite3_result_text16(sqlite3_context: Psqlite3_context; value: PWideChar;
  n: integer; destroy: pointer); cdecl; external SQLiteDLL name 'sqlite3_result_text16';
procedure sqlite3_result_text16be(sqlite3_context: Psqlite3_context; value: PWideChar;
  n: integer; destroy: pointer); cdecl; external SQLiteDLL name 'sqlite3_result_text16be';
procedure sqlite3_result_text16le(sqlite3_context: Psqlite3_context; value: PWideChar;
  n: integer; destroy: pointer); cdecl; external SQLiteDLL name 'sqlite3_result_text16le';
procedure sqlite3_result_value(sqlite3_context: Psqlite3_context; value: Psqlite3_value);
  cdecl; external SQLiteDLL name 'sqlite3_result_value';
{
    void sqlite3_result_blob(sqlite3_context*, const void*, int n, void(*)(void*));
    void sqlite3_result_double(sqlite3_context*, double);
    void sqlite3_result_error(sqlite3_context*, const char*, int);
    void sqlite3_result_error16(sqlite3_context*, const void*, int);
    void sqlite3_result_int(sqlite3_context*, int);
    void sqlite3_result_int64(sqlite3_context*, long long int);
    void sqlite3_result_null(sqlite3_context*);
    void sqlite3_result_text(sqlite3_context*, const char*, int n, void(*)(void*));
    void sqlite3_result_text16(sqlite3_context*, const void*, int n, void(*)(void*));
    void sqlite3_result_text16be(sqlite3_context*, const void*, int n, void(*)(void*));
    void sqlite3_result_text16le(sqlite3_context*, const void*, int n, void(*)(void*));
    void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
}
function sqlite3_value_blob(value: pointer): Pointer;
  cdecl; external SQLiteDLL name 'sqlite3_value_blob';
function sqlite3_value_bytes(value: pointer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_value_bytes';
function sqlite3_value_bytes16(value: pointer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_value_bytes16';
function sqlite3_value_double(value: pointer): double;
  cdecl; external SQLiteDLL name 'sqlite3_value_double';
function sqlite3_value_int(value: pointer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_value_int';
function sqlite3_value_int64(value: pointer): int64;
  cdecl; external SQLiteDLL name 'sqlite3_value_int64';
function sqlite3_value_text(value: pointer): PChar;
  cdecl; external SQLiteDLL name 'sqlite3_value_text';
function sqlite3_value_text16(value: pointer): PWideChar;
  cdecl; external SQLiteDLL name 'sqlite3_value_text16';
function sqlite3_value_text16be(value: pointer): PWideChar;
  cdecl; external SQLiteDLL name 'sqlite3_value_text16be';
function sqlite3_value_text16le(value: pointer): PWideChar;
  cdecl; external SQLiteDLL name 'sqlite3_value_text16le';
function sqlite3_value_type(value: pointer): integer;
  cdecl; external SQLiteDLL name 'sqlite3_value_type';
{    const void *sqlite3_value_blob(sqlite3_value*);
    int sqlite3_value_bytes(sqlite3_value*);
    int sqlite3_value_bytes16(sqlite3_value*);
    double sqlite3_value_double(sqlite3_value*);
    int sqlite3_value_int(sqlite3_value*);
    long long int sqlite3_value_int64(sqlite3_value*);
    const unsigned char *sqlite3_value_text(sqlite3_value*);
    const void *sqlite3_value_text16(sqlite3_value*);
    const void *sqlite3_value_text16be(sqlite3_value*);
    const void *sqlite3_value_text16le(sqlite3_value*);
    int sqlite3_value_type(sqlite3_value*);
}
{
//Sample of usage:
PROCEDURE fn(ctx:pointer;n:integer;args:ppchar);cdecl;
VAR     p : ppchar; theString : string; res:integer;
BEGIN
p         := args;
theString := trim(sqlite3_value_text(p^));
...do something with theString...
sqlite3_result_int(ctx,res);  // < return a number based on string
END;
...
var i:integer;
begin
i := sqlite3_create_function(db3,'myfn',1,SQLITE_UTF8,nil,@fn,nil,nil);
s := 'select myfn(thestring) from theTable;'
...execute statement...
end;
}
implementation
end.
src/thread/grainThread.pas
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
{------------------------------------------------------------------------------}
{单元名称:grainThread.pas                                                     }
{模块名称:粮种选择线程                                                        }
{模块说明:线程创建后自动运行,完成一次粮种选择                                }
{建立日期:2024-07-02                                                          }
{修改修改:2024-07-02                                                          }
{版权所有:李良庭 liangtingli@outlook.com                                      }
{------------------------------------------------------------------------------}
unit grainThread;
interface
uses
  Windows, Classes, SysUtils, PubUtils, DateUtils, ActuatorLib;
type
  TGrainThread = class(TThread)
  private
    { Private declarations }
    t_ret : Integer;                //返回值
    t_faultCode : Word;             //水分仪故障码
    procedure UpdateCaption;        //手动检测反馈
    procedure UpdateCaption1;       //手动校准反馈
    procedure UpdateCaption2;       //调整截距反馈
    procedure UpdateFaultCode;
  protected
    procedure Start();
    procedure Execute; override;
  public
    constructor Create(param: Boolean=false);
    procedure Terminate;
  end;
implementation
uses
  uMain, Global, log4me, uInit;
{ TGrainThread }
//--------线程初始化----------------------------------------
//线程初始化
constructor TGrainThread.Create(param: Boolean=false);
begin
  //线程停止后自动释放
  inherited Create(param);        //设置线程运行, False-自动运行, True-手动启动
  FreeOnTerminate := True;        //设置线程退出自动销
  //返回值
  t_ret := 0;
  t_faultCode := 0;
end;
//线程销毁事件
procedure TGrainThread.Terminate;
begin
  inherited;
  m_GrainThread := 0;             //清理线程句柄
end;
//--------界面处理函数--------------------------------------
//手动检测时,下发粮种反馈信息
procedure TGrainThread.UpdateCaption;
begin
  with frmMain do begin
    //向界面返回信息
    if t_ret<>0 then
      lblManTest.Caption := '粮食品种修改失败!'
    else
      lblManTest.Caption := '粮食品种修改成功,准备就绪!';
    //显示当前加载的粮种信息
    sLabel15.Caption := Format('粮食种类 - [%s]',[Grain.Name]);
    log4Info(Format('粮种:当前选中[%s], ä»£ç [%d], æ ¡å‡†ç³»æ•°[%s,%s,%s,%s,%s]',
                    [Grain.Name,
                     Grain.Code,
                     Grain.Coef[0],
                     Grain.Coef[1],
                     Grain.Coef[2],
                     Grain.Coef[3],
                     Grain.Coef[4]]));
  end;
end;
//手动校准时,下发粮种反馈信息
procedure TGrainThread.UpdateCaption1;
begin
  with frmMain do begin
    if t_ret<>0 then
      lblVerify.Caption := '粮食品种修改失败'
    else
      lblVerify.Caption := '粮食品种修改成功,校准就绪!';
    //加载粮种校准系数
    edtAutoCoef1.Text := Grain.coef[0];
    edtAutoCoef2.Text := Grain.coef[1];
    edtAutoCoef3.Text := Grain.coef[2];
    edtAutoCoef4.Text := Grain.coef[3];
    edtAutoCoef5.Text := Grain.coef[4];
    //显示当前加载的粮种信息
    sLabel3.Caption := Format('选择 - [%s]',[Grain.Name]);
    log4Info(Format('粮种:当前选中[%s], ä»£ç [%d], æ ¡å‡†ç³»æ•°[%s,%s,%s,%s,%s]',
                   [Grain.Name,
                    Grain.Code,
                    Grain.Coef[0],
                    Grain.Coef[1],
                    Grain.Coef[2],
                    Grain.Coef[3],
                    Grain.Coef[4]]));
  end;
end;
//调整截距时,下发粮种反馈信息
procedure TGrainThread.UpdateCaption2;
begin
  with frmMain do begin
    //向界面返回信息
    if t_ret<>0 then
      lblInter.Caption := '粮食品种修改失败!'
    else
      lblInter.Caption := '粮食品种修改成功,准备就绪!';
    //显示当前加载的粮种信息
    sLabel70.Caption := Format('粮食种类 - [%s]',[Grain.Name]);
    log4Info(Format('粮种:当前选中[%s], ä»£ç [%d], æ ¡å‡†ç³»æ•°[%s,%s,%s,%s,%s]',
                    [Grain.Name,
                     Grain.Code,
                     Grain.Coef[0],
                     Grain.Coef[1],
                     Grain.Coef[2],
                     Grain.Coef[3],
                     Grain.Coef[4]]));
  end;
end;
//出错显示--仪器自检出错
procedure TGrainThread.UpdateFaultCode;
begin
  RefashFaultCode(t_faultCode);
end;
//------- æ‰§è¡Œçº¿ç¨‹ ----------------------------------------
procedure TGrainThread.Start();
begin
  //下发粮种信息
  {log4info(Format('线程信息:下发粮种指令,ctxDev=[%d],CmdType=[%d],GrainType=[%d],Resp=[2].',
                  [hWrDev, WR_GOODS, Grain.Code]));}
  t_ret := SendCommands(hWrDev, WR_GOODS, Grain.Code, 2);    //这里指令阻塞时间=2s
  //向界面输出结果
  if s_Grain=1 then
    Synchronize(UpdateCaption)  //手动检测反馈 1
  else if s_Grain=2 then
    Synchronize(UpdateCaption1) //手动校准反馈 2
  else
    Synchronize(UpdateCaption2);//调整截距反馈 3
  //检查水分仪故障码
  ReadFaultCode(hWrDev, @t_faultCode);
  Synchronize(UpdateFaultCode);
end;
//------- çº¿ç¨‹å…¥å£ ----------------------------------------
procedure TGrainThread.Execute;
begin
  { Place thread code here }
  try
    //选择粮种
    Start();
    //防止线程阻塞CPU
    Sleep(1);
  finally
    //手动退出线程
    m_GrainThread := 0;
  end;
end;
end.
在上述文件截断后对比
src/thread/grainThread.~pas src/thread/interceptThread.pas src/thread/interceptThread.~pas src/thread/mantestThread.pas src/thread/mantestThread.~pas src/thread/readyThread.pas src/thread/resetThread.pas src/thread/resetThread.~pas src/thread/statusThread.pas src/thread/statusThread.~pas src/thread/testThread - 副本.pas src/thread/testThread.pas src/thread/testThread.~pas src/thread/verifyThread.pas src/thread/verifyThread.~pas src/thread/vreadyThread.pas src/uCalc.ddp src/uCalc.dfm src/uCalc.pas src/uCalc.~ddp src/uCalc.~dfm src/uCalc.~pas src/uDM.ddp src/uDM.dfm src/uDM.pas src/uDM.~ddp src/uDM.~dfm src/uDM.~pas src/uInput.ddp src/uInput.dfm src/uInput.pas src/uMain.ddp src/uMain.dfm src/uMain.pas src/uMain.~ddp src/uMain.~dfm src/uMain.~pas src/uSaveData.pas src/uSaveData.~pas src/uTablet.ddp src/uTablet.dfm src/uTablet.pas src/uTablet.~dfm src/uTablet.~pas