From 36dafaa8ffff071b7ab681137191364430e6e974 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 10 Jul 2007 08:24:50 +0000 Subject: [PATCH] git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.jcl@8 c37d764d-f447-7644-a108-883140d013fb --- official/1.100/Install.bat | 24 + official/1.100/Install.txt | 72 + official/1.100/InstallForDelphi.bat | 38 + official/1.100/QInstall.bat | 13 + official/1.100/bin/dirinfo.txt | 1 + official/1.100/clean.bat | 16 + official/1.100/clean.sh | 12 + official/1.100/devtools/included_files.bat | 16 + official/1.100/devtools/included_files.sh | 18 + official/1.100/devtools/jpp | Bin 0 -> 185212 bytes official/1.100/devtools/jpp.exe | Bin 0 -> 123904 bytes official/1.100/devtools/pgEdit.exe | Bin 0 -> 1371136 bytes official/1.100/devtools/pgEdit.xml | 138 + official/1.100/docs/Contacting authors.html | 35 + official/1.100/docs/Contributors.html | 199 + official/1.100/docs/Contributors.txt | 115 + official/1.100/docs/Experts.html | 160 + official/1.100/docs/MPL FAQ.html | 131 + official/1.100/docs/MPL-1.1.txt | 470 + official/1.100/docs/Readme.html | 318 + official/1.100/docs/Readme.txt | 329 + official/1.100/docs/ThreadSafe.txt | 28 + official/1.100/docs/cps.html | 655 + official/1.100/docs/cps_files/strucv1.jpg | Bin 0 -> 33442 bytes official/1.100/docs/cps_files/test.css | 793 + official/1.100/docs/styles/default.css | 34 + official/1.100/examples/C10.exc | 1 + official/1.100/examples/C5.exc | 6 + official/1.100/examples/C6.exc | 5 + official/1.100/examples/D10.exc | 1 + official/1.100/examples/D11.exc | 1 + official/1.100/examples/D5.exc | 2 + official/1.100/examples/D6.exc | 1 + official/1.100/examples/D7.exc | 1 + official/1.100/examples/D9.exc | 1 + .../1.100/examples/JclDebugExamples.bdsgroup | 23 + official/1.100/examples/JclDebugExamples.bpg | 33 + .../algorithms/AlgorithmsExample.dof | 2 + .../algorithms/AlgorithmsExample.dpr | 21 + .../algorithms/AlgorithmsExample.res | Bin 0 -> 876 bytes .../algorithms/AlgorithmsExampleMain.dfm | 250 + .../algorithms/AlgorithmsExampleMain.pas | 246 + .../containers/hashing/HashingExample.dof | 76 + .../containers/hashing/HashingExample.dpr | 21 + .../containers/hashing/HashingExample.res | Bin 0 -> 876 bytes .../containers/hashing/HashingExampleMain.dfm | 129 + .../containers/hashing/HashingExampleMain.pas | 335 + .../common/containers/lists/ListExample.dof | 76 + .../common/containers/lists/ListExample.dpr | 22 + .../common/containers/lists/ListExample.res | Bin 0 -> 876 bytes .../containers/lists/ListExampleMain.dfm | 119 + .../containers/lists/ListExampleMain.pas | 475 + .../common/containers/lists/MyObjectList.pas | 134 + .../performance/ContainerPerformance.dof | 3 + .../performance/ContainerPerformance.dpr | 22 + .../performance/ContainerPerformance.res | Bin 0 -> 876 bytes .../performance/ContainerPerformanceMain.dfm | 97 + .../performance/ContainerPerformanceMain.pas | 148 + .../performance/ContainerPerformanceTests.pas | 325 + .../common/containers/trees/TreeExample.dof | 2 + .../common/containers/trees/TreeExample.dpr | 21 + .../common/containers/trees/TreeExample.res | Bin 0 -> 876 bytes .../containers/trees/TreeExampleMain.dfm | 53 + .../containers/trees/TreeExampleMain.pas | 142 + .../common/expreval/ExprEvalExample.dof | 3 + .../common/expreval/ExprEvalExample.dpr | 19 + .../common/expreval/ExprEvalExample.res | Bin 0 -> 876 bytes .../common/expreval/ExprEvalExampleLogic.pas | 105 + .../common/expreval/ExprEvalExampleMain.dfm | 71 + .../common/expreval/ExprEvalExampleMain.pas | 67 + .../common/expreval/QExprEvalExample.dof | 2 + .../common/expreval/QExprEvalExample.dpr | 16 + .../common/expreval/QExprEvalExample.res | Bin 0 -> 876 bytes .../common/expreval/QExprEvalExampleMain.pas | 62 + .../common/expreval/QExprEvalExampleMain.xfm | 71 + .../common/filesearch/QFileSearchDemo.dof | 2 + .../common/filesearch/QFileSearchDemo.dpr | 16 + .../common/filesearch/QFileSearchDemo.res | Bin 0 -> 876 bytes .../common/filesearch/QFileSearchDemoMain.dfm | 352 + .../common/filesearch/QFileSearchDemoMain.pas | 280 + .../common/filesearch/QFileSearchDemoMain.xfm | 378 + .../common/graphics/QClipLineDemo.dof | 4 + .../common/graphics/QClipLineDemo.dpr | 17 + .../common/graphics/QClipLineDemo.res | Bin 0 -> 876 bytes .../common/graphics/QClipLineDemoMain.dfm | 17 + .../common/graphics/QClipLineDemoMain.pas | 94 + .../common/graphics/QClipLineDemoMain.xfm | 19 + .../graphics/StretchGraphicDemoMain.dfm | 217 + .../graphics/StretchGraphicDemoMain.pas | 510 + .../common/graphics/StretchGraphicExample.dof | 3 + .../common/graphics/StretchGraphicExample.dpr | 16 + .../common/graphics/StretchGraphicExample.res | Bin 0 -> 876 bytes .../common/multimedia/MidiOutExample.dof | 3 + .../common/multimedia/MidiOutExample.dpr | 16 + .../common/multimedia/MidiOutExample.res | Bin 0 -> 876 bytes .../common/multimedia/MidiOutExampleMain.dfm | 488 + .../common/multimedia/MidiOutExampleMain.pas | 194 + .../multimedia/MidiOutExampleTuningDlg.dfm | 102 + .../multimedia/MidiOutExampleTuningDlg.pas | 170 + .../common/numformat/QNumFormatExample.dof | 2 + .../common/numformat/QNumFormatExample.dpr | 16 + .../common/numformat/QNumFormatExample.res | Bin 0 -> 876 bytes .../numformat/QNumFormatExampleMain.pas | 217 + .../numformat/QNumFormatExampleMain.xfm | 224 + .../1.100/examples/common/pcre/PCREDemo.dof | 2 + .../1.100/examples/common/pcre/PCREDemo.dpr | 17 + .../1.100/examples/common/pcre/PCREDemo.res | Bin 0 -> 876 bytes .../examples/common/pcre/PCREDemoMain.dfm | 233 + .../examples/common/pcre/PCREDemoMain.pas | 200 + .../1.100/examples/common/pcre/QPCREDemo.dof | 3 + .../1.100/examples/common/pcre/QPCREDemo.dpr | 17 + .../1.100/examples/common/pcre/QPCREDemo.res | Bin 0 -> 876 bytes .../examples/common/pcre/QPCREDemoMain.pas | 176 + .../examples/common/pcre/QPCREDemoMain.xfm | 239 + .../1.100/examples/common/rtti/QRTTIDemo.dof | 2 + .../1.100/examples/common/rtti/QRTTIDemo.dpr | 16 + .../1.100/examples/common/rtti/QRTTIDemo.res | Bin 0 -> 1508 bytes .../examples/common/rtti/QRTTIDemoMain.pas | 332 + .../examples/common/rtti/QRTTIDemoMain.xfm | 76 + .../examples/common/rtti/RTTIDemoMain.dfm | 71 + .../examples/common/rtti/RTTIDemoMain.pas | 331 + .../examples/common/rtti/RTTIExample.dof | 3 + .../examples/common/rtti/RTTIExample.dpr | 16 + .../examples/common/rtti/RTTIExample.res | Bin 0 -> 876 bytes .../common/sysinfo/QEnvironmentExample.dof | 3 + .../common/sysinfo/QEnvironmentExample.dpr | 16 + .../common/sysinfo/QEnvironmentExample.res | Bin 0 -> 876 bytes .../sysinfo/QEnvironmentExampleMain.pas | 76 + .../sysinfo/QEnvironmentExampleMain.xfm | 46 + .../common/textreader/TextReaderDemoMain.dfm | 94 + .../common/textreader/TextReaderDemoMain.pas | 153 + .../common/textreader/TextReaderExample.dof | 3 + .../common/textreader/TextReaderExample.dpr | 16 + .../common/textreader/TextReaderExample.res | Bin 0 -> 876 bytes .../unitversioning/UnitVersioningTest.dof | 2 + .../unitversioning/UnitVersioningTest.dpr | 46 + .../unitversioning/UnitVersioningTest.res | Bin 0 -> 876 bytes .../unitversioning/UnitVersioningTestDLL.dof | 2 + .../unitversioning/UnitVersioningTestDLL.dpr | 48 + .../unitversioning/UnitVersioningTestMain.dfm | 91 + .../unitversioning/UnitVersioningTestMain.pas | 290 + .../dotnet/JCLNetDemo/AssemblyInfo.cs | 67 + .../JCLNetDemo/JCLNet.FrmMain.resources | Bin 0 -> 7154 bytes .../JCLNetDemo/JCLNet.WinForm.resources | Bin 0 -> 3602 bytes .../examples/dotnet/JCLNetDemo/JCLNet.bdsproj | 102 + .../examples/dotnet/JCLNetDemo/WinForm.cs | 254 + .../examples/dotnet/JCLNetDemo/WinForm.resx | 202 + official/1.100/examples/k3.exc | 48 + official/1.100/examples/visclx.exc | 7 + .../examples/windows/ConsoleExamples.dof | 3 + .../examples/windows/ConsoleExamples.dpr | 409 + .../windows/appinst/AppInstDemoMain.dfm | 131 + .../windows/appinst/AppInstDemoMain.pas | 169 + .../windows/appinst/AppInstExample.dof | 3 + .../windows/appinst/AppInstExample.dpr | 16 + .../windows/appinst/AppInstExample.res | Bin 0 -> 876 bytes .../windows/appinst/SingleInstDemoMain.dfm | 25 + .../windows/appinst/SingleInstDemoMain.pas | 34 + .../windows/appinst/SingleInstExample.dof | 3 + .../windows/appinst/SingleInstExample.dpr | 18 + .../windows/appinst/SingleInstExample.res | Bin 0 -> 876 bytes .../asuser/CreateProcAsUserDemoMain.dfm | 194 + .../asuser/CreateProcAsUserDemoMain.pas | 93 + .../asuser/CreateProcAsUserExample.dof | 3 + .../asuser/CreateProcAsUserExample.dpr | 17 + .../asuser/CreateProcAsUserExample.res | Bin 0 -> 876 bytes .../1.100/examples/windows/clr/ClrDemo.dof | 3 + .../1.100/examples/windows/clr/ClrDemo.dpr | 24 + .../1.100/examples/windows/clr/ClrDemo.res | Bin 0 -> 1128 bytes .../windows/clr/ClrDemoAbstractFrame.dfm | 7 + .../windows/clr/ClrDemoAbstractFrame.pas | 105 + .../examples/windows/clr/ClrDemoBlobForm.dfm | 71 + .../examples/windows/clr/ClrDemoBlobForm.pas | 71 + .../examples/windows/clr/ClrDemoCLRFrame.dfm | 184 + .../examples/windows/clr/ClrDemoCLRFrame.pas | 183 + .../examples/windows/clr/ClrDemoGuidForm.dfm | 48 + .../examples/windows/clr/ClrDemoGuidForm.pas | 53 + .../examples/windows/clr/ClrDemoMain.dfm | 171 + .../examples/windows/clr/ClrDemoMain.pas | 195 + .../windows/clr/ClrDemoMetaDataFrame.dfm | 70 + .../windows/clr/ClrDemoMetaDataFrame.pas | 56 + .../windows/clr/ClrDemoStringsForm.dfm | 52 + .../windows/clr/ClrDemoStringsForm.pas | 54 + .../examples/windows/clr/ClrDemoTableForm.dfm | 102 + .../examples/windows/clr/ClrDemoTableForm.pas | 598 + .../windows/clr/ClrDemoUserStringsForm.dfm | 52 + .../windows/clr/ClrDemoUserStringsForm.pas | 54 + .../debug/framestrack/FramesTrackDemoMain.dfm | 91 + .../debug/framestrack/FramesTrackDemoMain.pas | 186 + .../debug/framestrack/FramesTrackExample.dof | 3 + .../debug/framestrack/FramesTrackExample.dpr | 16 + .../debug/framestrack/FramesTrackExample.res | Bin 0 -> 876 bytes .../ExceptionReportConverter.dpr | 18 + .../ExceptionReportConverter.res | Bin 0 -> 876 bytes .../debug/reportconverter/formConverter.dfm | 65 + .../debug/reportconverter/formConverter.pas | 194 + .../debug/sourceloc/SourceLocDemoMain.dfm | 134 + .../debug/sourceloc/SourceLocDemoMain.pas | 124 + .../debug/sourceloc/SourceLocExample.dof | 3 + .../debug/sourceloc/SourceLocExample.dpr | 16 + .../debug/sourceloc/SourceLocExample.res | Bin 0 -> 876 bytes .../StackTrackDLLsComLibrary.bdsproj | 175 + .../stacktrack/StackTrackDLLsComLibrary.dof | 3 + .../stacktrack/StackTrackDLLsComLibrary.dpr | 20 + .../stacktrack/StackTrackDLLsComLibrary.res | Bin 0 -> 876 bytes .../stacktrack/StackTrackDLLsComLibrary.tlb | Bin 0 -> 1668 bytes .../StackTrackDLLsComLibrary_TLB.pas | 97 + .../stacktrack/StackTrackDLLsComUnit.pas | 38 + .../stacktrack/StackTrackDLLsDemoMain.dfm | 115 + .../stacktrack/StackTrackDLLsDemoMain.pas | 130 + .../StackTrackDLLsDynamicLibrary.bdsproj | 175 + .../StackTrackDLLsDynamicLibrary.dof | 3 + .../StackTrackDLLsDynamicLibrary.dpr | 15 + .../StackTrackDLLsDynamicLibrary.res | Bin 0 -> 876 bytes .../stacktrack/StackTrackDLLsDynamicUnit.pas | 28 + .../stacktrack/StackTrackDLLsExample.bdsproj | 175 + .../stacktrack/StackTrackDLLsExample.dof | 3 + .../stacktrack/StackTrackDLLsExample.dpr | 17 + .../stacktrack/StackTrackDLLsExample.res | Bin 0 -> 876 bytes .../StackTrackDLLsStaticLibrary.bdsproj | 175 + .../StackTrackDLLsStaticLibrary.dof | 3 + .../StackTrackDLLsStaticLibrary.dpr | 15 + .../StackTrackDLLsStaticLibrary.res | Bin 0 -> 876 bytes .../stacktrack/StackTrackDLLsStaticUnit.pas | 28 + .../debug/stacktrack/StackTrackDemoMain.dfm | 95 + .../debug/stacktrack/StackTrackDemoMain.pas | 110 + .../stacktrack/StackTrackExample.bdsproj | 175 + .../debug/stacktrack/StackTrackExample.dof | 3 + .../debug/stacktrack/StackTrackExample.dpr | 16 + .../debug/stacktrack/StackTrackExample.res | Bin 0 -> 876 bytes .../threadexcept/ThreadExceptDemoMain.dfm | 93 + .../threadexcept/ThreadExceptDemoMain.pas | 166 + .../threadexcept/ThreadExceptExample.dof | 4 + .../threadexcept/ThreadExceptExample.dpr | 18 + .../threadexcept/ThreadExceptExample.res | Bin 0 -> 876 bytes .../windows/delphitools/DelphiToolsGroup.bpg | 33 + .../examples/windows/delphitools/Readme.txt | 24 + .../windows/delphitools/common/About.dfm | 74 + .../windows/delphitools/common/About.pas | 180 + .../delphitools/common/D6MdiMsgFix.pas | 85 + .../windows/delphitools/common/FindDlg.dfm | 107 + .../windows/delphitools/common/FindDlg.pas | 202 + .../delphitools/common/SHDocVw_TLB.pas | 1931 + .../windows/delphitools/common/ToolsUtils.pas | 377 + .../dependencyviewer/DependView.dof | 134 + .../dependencyviewer/DependView.dpr | 24 + .../dependencyviewer/DependView.res | Bin 0 -> 1672 bytes .../dependencyviewer/DependViewMain.dfm | 1393 + .../dependencyviewer/DependViewMain.pas | 346 + .../dependencyviewer/FileViewer.dfm | 239 + .../dependencyviewer/FileViewer.pas | 663 + .../windows/delphitools/peviewer/PeDump.dfm | 499 + .../windows/delphitools/peviewer/PeDump.pas | 943 + .../windows/delphitools/peviewer/PeGenDef.dfm | 144 + .../windows/delphitools/peviewer/PeGenDef.pas | 343 + .../delphitools/peviewer/PeResView.dfm | 420 + .../delphitools/peviewer/PeResView.pas | 710 + .../delphitools/peviewer/PeResource.pas | 1535 + .../windows/delphitools/peviewer/PeSearch.dfm | 162 + .../windows/delphitools/peviewer/PeSearch.pas | 226 + .../windows/delphitools/peviewer/PeViewer.dof | 134 + .../windows/delphitools/peviewer/PeViewer.dpr | 33 + .../windows/delphitools/peviewer/PeViewer.res | Bin 0 -> 1636 bytes .../windows/delphitools/peviewer/PeViewer.tlb | Bin 0 -> 1672 bytes .../delphitools/peviewer/PeViewerControl.pas | 83 + .../delphitools/peviewer/PeViewerMain.dfm | 2179 ++ .../delphitools/peviewer/PeViewerMain.pas | 631 + .../delphitools/peviewer/PeViewer_TLB.pas | 117 + .../windows/delphitools/resfix/ResFix.dof | 145 + .../windows/delphitools/resfix/ResFix.dpr | 20 + .../windows/delphitools/resfix/ResFix.res | Bin 0 -> 1700 bytes .../windows/delphitools/resfix/ResFixMain.dfm | 1052 + .../windows/delphitools/resfix/ResFixMain.pas | 263 + .../windows/delphitools/screenjpg/Main.dfm | 901 + .../windows/delphitools/screenjpg/Main.pas | 285 + .../delphitools/screenjpg/ScreenJPG.dof | 134 + .../delphitools/screenjpg/ScreenJPG.dpr | 20 + .../delphitools/screenjpg/ScreenJPG.res | Bin 0 -> 1696 bytes .../toolhelpview/ChangePriority.dfm | 44 + .../toolhelpview/ChangePriority.pas | 114 + .../delphitools/toolhelpview/Global.dfm | 1081 + .../delphitools/toolhelpview/Global.pas | 132 + .../delphitools/toolhelpview/HeapDump.dfm | 235 + .../delphitools/toolhelpview/HeapDump.pas | 334 + .../windows/delphitools/toolhelpview/Main.dfm | 876 + .../windows/delphitools/toolhelpview/Main.pas | 936 + .../delphitools/toolhelpview/MemoryDump.dfm | 282 + .../delphitools/toolhelpview/MemoryDump.pas | 514 + .../delphitools/toolhelpview/ModulesDump.dfm | 180 + .../delphitools/toolhelpview/ModulesDump.pas | 245 + .../toolhelpview/ToolHelpViewer.dof | 134 + .../toolhelpview/ToolHelpViewer.dpr | 35 + .../toolhelpview/ToolHelpViewer.res | Bin 0 -> 1720 bytes .../delphitools/toolhelpview/ViewTemplate.dfm | 109 + .../delphitools/toolhelpview/ViewTemplate.pas | 155 + .../1.100/examples/windows/edisdk/Clean.bat | 18 + .../examples/windows/edisdk/EDICOMExample.dof | 2 + .../examples/windows/edisdk/EDICOMExample.dpr | 16 + .../examples/windows/edisdk/EDICOMExample.res | Bin 0 -> 876 bytes .../windows/edisdk/EDICOMExampleMain.dfm | 50 + .../windows/edisdk/EDICOMExampleMain.pas | 157 + .../examples/windows/edisdk/EDISDK_TLB.dcr | Bin 0 -> 3338 bytes .../examples/windows/edisdk/EDISDK_TLB.pas | 1021 + .../windows/edisdk/comserver/Clean.bat | 18 + .../windows/edisdk/comserver/EDISDK.dof | 13 + .../windows/edisdk/comserver/EDISDK.dpr | 23 + .../windows/edisdk/comserver/EDISDK.res | Bin 0 -> 1792 bytes .../windows/edisdk/comserver/EDISDK.tlb | Bin 0 -> 10488 bytes .../windows/edisdk/comserver/EDISDK_TLB.pas | 651 + .../edisdk/comserver/JclEDICOM_ANSIX12.pas | 1059 + .../windows/edisdk/comserver/sample.edi | 1 + .../1.100/examples/windows/edisdk/sample.edi | 1 + .../examples/windows/edisdk/vb5/Form1.frm | 164 + .../examples/windows/edisdk/vb5/Form1.frx | 1 + .../examples/windows/edisdk/vb5/Project1.vbp | 39 + .../examples/windows/edisdk/vb5/Project1.vbw | 1 + .../examples/windows/edisdk/vb5/sample.edi | 1 + .../filesummary/FileSummaryDemoMain.dfm | 56 + .../filesummary/FileSummaryDemoMain.pas | 309 + .../filesummary/FileSummaryExample.dof | 3 + .../filesummary/FileSummaryExample.dpr | 16 + .../filesummary/FileSummaryExample.res | Bin 0 -> 4396 bytes .../windows/fileversion/VerInfoDemoMain.dfm | 55 + .../windows/fileversion/VerInfoDemoMain.pas | 77 + .../windows/fileversion/VerInfoExample.dof | 82 + .../windows/fileversion/VerInfoExample.dpr | 16 + .../windows/fileversion/VerInfoExample.res | Bin 0 -> 876 bytes .../windows/lanman/LanManDemoMain.dfm | 271 + .../windows/lanman/LanManDemoMain.pas | 124 + .../examples/windows/lanman/LanManExample.dof | 3 + .../examples/windows/lanman/LanManExample.dpr | 16 + .../examples/windows/lanman/LanManExample.res | Bin 0 -> 876 bytes .../windows/locales/LocalesDemoMain.dfm | 306 + .../windows/locales/LocalesDemoMain.pas | 290 + .../windows/locales/LocalesExample.dof | 3 + .../windows/locales/LocalesExample.dpr | 16 + .../windows/locales/LocalesExample.res | Bin 0 -> 876 bytes .../examples/windows/mapi/MapiDemoMain.dfm | 257 + .../examples/windows/mapi/MapiDemoMain.pas | 207 + .../examples/windows/mapi/MapiExample.dof | 3 + .../examples/windows/mapi/MapiExample.dpr | 16 + .../examples/windows/mapi/MapiExample.res | Bin 0 -> 876 bytes .../windows/mapi/ReadMailDemoMain.dfm | 91 + .../windows/mapi/ReadMailDemoMain.pas | 124 + .../examples/windows/mapi/ReadMailExample.dof | 3 + .../examples/windows/mapi/ReadMailExample.dpr | 16 + .../examples/windows/mapi/ReadMailExample.res | Bin 0 -> 876 bytes .../windows/multimedia/MultiMediaExample.dof | 3 + .../windows/multimedia/MultiMediaExample.dpr | 16 + .../windows/multimedia/MultiMediaExample.res | Bin 0 -> 876 bytes .../windows/multimedia/MultimediaDemoMain.dfm | 215 + .../windows/multimedia/MultimediaDemoMain.pas | 555 + .../examples/windows/ntfs/JEDISoftLinks.dof | 4 + .../examples/windows/ntfs/JEDISoftLinks.dpr | 16 + .../examples/windows/ntfs/JEDISoftLinks.tlb | Bin 0 -> 1044 bytes .../windows/ntfs/JEDISoftLinks_TLB.pas | 49 + .../windows/ntfs/SoftLinkDragDropHandler.pas | 228 + .../windows/ntservice/NtSvcDemoDependent.dfm | 63 + .../windows/ntservice/NtSvcDemoDependent.pas | 88 + .../windows/ntservice/NtSvcDemoGroups.dfm | 35 + .../windows/ntservice/NtSvcDemoGroups.pas | 76 + .../windows/ntservice/NtSvcDemoMain.dfm | 275 + .../windows/ntservice/NtSvcDemoMain.pas | 416 + .../windows/ntservice/NtSvcExample.dof | 3 + .../windows/ntservice/NtSvcExample.dpr | 18 + .../windows/ntservice/NtSvcExample.res | Bin 0 -> 876 bytes .../windows/peimage/ApiHookDemoMain.dfm | 53 + .../windows/peimage/ApiHookDemoMain.pas | 82 + .../windows/peimage/ApiHookExample.dof | 3 + .../windows/peimage/ApiHookExample.dpr | 16 + .../windows/peimage/ApiHookExample.res | Bin 0 -> 876 bytes .../windows/peimage/PeFuncDemoMain.dfm | 165 + .../windows/peimage/PeFuncDemoMain.pas | 124 + .../windows/peimage/PeFuncExample.dof | 3 + .../windows/peimage/PeFuncExample.dpr | 16 + .../windows/peimage/PeFuncExample.res | Bin 0 -> 876 bytes .../windows/peimage/UnmangleNameDemoMain.dfm | 111 + .../windows/peimage/UnmangleNameDemoMain.pas | 228 + .../windows/peimage/UnmangleNameExample.dof | 3 + .../windows/peimage/UnmangleNameExample.dpr | 16 + .../windows/peimage/UnmangleNameExample.res | Bin 0 -> 876 bytes .../windows/registry/RegistryDemoMain.dfm | 53 + .../windows/registry/RegistryDemoMain.pas | 174 + .../windows/registry/RegistryExample.dof | 3 + .../windows/registry/RegistryExample.dpr | 16 + .../windows/registry/RegistryExample.res | Bin 0 -> 876 bytes .../windows/structstorage/HexDump.pas | 535 + .../windows/structstorage/PropsFrm.dfm | 221 + .../windows/structstorage/PropsFrm.pas | 172 + .../structstorage/StructStorageExample.dof | 2 + .../structstorage/StructStorageExample.dpr | 19 + .../structstorage/StructStorageExample.res | Bin 0 -> 876 bytes .../StructStorageExampleMain.dfm | 548 + .../StructStorageExampleMain.pas | 938 + .../windows/sysinfo/SysInfoDemoMain.dfm | 1010 + .../windows/sysinfo/SysInfoDemoMain.pas | 310 + .../windows/sysinfo/SysInfoExample.dof | 3 + .../windows/sysinfo/SysInfoExample.dpr | 16 + .../windows/sysinfo/SysInfoExample.res | Bin 0 -> 876 bytes .../1.100/examples/windows/tasks/TaskDemo.dof | 3 + .../1.100/examples/windows/tasks/TaskDemo.dpr | 18 + .../1.100/examples/windows/tasks/TaskDemo.res | Bin 0 -> 876 bytes .../windows/tasks/TaskDemoDataModule.dfm | 475 + .../windows/tasks/TaskDemoDataModule.pas | 164 + .../examples/windows/tasks/TaskDemoMain.dfm | 217 + .../examples/windows/tasks/TaskDemoMain.pas | 244 + .../1.100/experts/common/JclConfigure.ico | Bin 0 -> 318 bytes official/1.100/experts/common/JclImages.rc | 2 + official/1.100/experts/common/JclImages.res | Bin 0 -> 2572 bytes .../common/JclOtaActionConfigureSheet.dfm | 68 + .../common/JclOtaActionConfigureSheet.pas | 146 + .../common/JclOtaConfigurationForm.dfm | 111 + .../common/JclOtaConfigurationForm.pas | 234 + .../1.100/experts/common/JclOtaConsts.pas | 117 + .../experts/common/JclOtaExceptionForm.dfm | 63 + .../experts/common/JclOtaExceptionForm.pas | 133 + .../1.100/experts/common/JclOtaResources.pas | 341 + official/1.100/experts/common/JclOtaUtils.pas | 1281 + .../1.100/experts/common/JclOtaWizardForm.dfm | 123 + .../1.100/experts/common/JclOtaWizardForm.pas | 236 + .../experts/common/JclOtaWizardFrame.dfm | 8 + .../experts/common/JclOtaWizardFrame.pas | 92 + official/1.100/experts/common/JclSplash.bmp | Bin 0 -> 2102 bytes official/1.100/experts/debug/Howto.txt | 91 + .../1.100/experts/debug/JclDebugThread.pas | 186 + .../converter/JclDebugIdeConfigFrame.dfm | 36 + .../converter/JclDebugIdeConfigFrame.pas | 108 + .../debug/converter/JclDebugIdeIcon.res | Bin 0 -> 596 bytes .../debug/converter/JclDebugIdeImpl.pas | 641 + .../debug/converter/JclDebugIdeResult.dfm | 228 + .../debug/converter/JclDebugIdeResult.pas | 200 + .../experts/debug/dialog/ClxExceptDlg.ico | Bin 0 -> 766 bytes .../experts/debug/dialog/ClxExceptDlg.pas | 754 + .../experts/debug/dialog/ClxExceptDlg.xfm | 203 + .../experts/debug/dialog/CreateStdDialogs.dpr | 84 + .../debug/dialog/ExceptDlg.CBuilder32.cpp | 1 + .../debug/dialog/ExceptDlg.CBuilder32.dfm | 1 + .../debug/dialog/ExceptDlg.CBuilder32.h | 1 + .../debug/dialog/ExceptDlg.Delphi32.dfm | 108 + .../debug/dialog/ExceptDlg.Delphi32.pas | 711 + .../1.100/experts/debug/dialog/ExceptDlg.dfm | 97 + .../1.100/experts/debug/dialog/ExceptDlg.ico | Bin 0 -> 766 bytes .../1.100/experts/debug/dialog/ExceptDlg.pas | 655 + .../experts/debug/dialog/ExceptDlgCpp.ico | Bin 0 -> 766 bytes .../experts/debug/dialog/ExceptDlgMail.dfm | 108 + .../experts/debug/dialog/ExceptDlgMail.ico | Bin 0 -> 766 bytes .../experts/debug/dialog/ExceptDlgMail.pas | 675 + .../debug/dialog/JclOtaExcDlgFileFrame.dfm | 79 + .../debug/dialog/JclOtaExcDlgFileFrame.pas | 205 + .../debug/dialog/JclOtaExcDlgFormFrame.dfm | 65 + .../debug/dialog/JclOtaExcDlgFormFrame.pas | 144 + .../debug/dialog/JclOtaExcDlgIcons.RES | Bin 0 -> 1728 bytes .../experts/debug/dialog/JclOtaExcDlgIcons.rc | 2 + .../debug/dialog/JclOtaExcDlgIgnoreFrame.dfm | 34 + .../debug/dialog/JclOtaExcDlgIgnoreFrame.pas | 124 + .../debug/dialog/JclOtaExcDlgRepository.pas | 174 + .../debug/dialog/JclOtaExcDlgSystemFrame.dfm | 73 + .../debug/dialog/JclOtaExcDlgSystemFrame.pas | 147 + .../debug/dialog/JclOtaExcDlgTraceFrame.dfm | 83 + .../debug/dialog/JclOtaExcDlgTraceFrame.pas | 220 + .../debug/dialog/JclOtaExcDlgWizard.dfm | 5 + .../debug/dialog/JclOtaExcDlgWizard.pas | 109 + .../debug/dialog/JclOtaRepositoryReg.pas | 373 + .../debug/dialog/JclOtaRepositoryUtils.pas | 577 + .../experts/debug/dialog/JclOtaTemplates.pas | 322 + .../experts/debug/simdview/JclSIMDCpuInfo.dfm | 158 + .../experts/debug/simdview/JclSIMDCpuInfo.pas | 97 + .../experts/debug/simdview/JclSIMDIcon.dcr | Bin 0 -> 428 bytes .../debug/simdview/JclSIMDModifyForm.dfm | 115 + .../debug/simdview/JclSIMDModifyForm.pas | 531 + .../experts/debug/simdview/JclSIMDTestBCB.cpp | 102 + .../debug/simdview/JclSIMDTestBCBProject.bpf | 5 + .../debug/simdview/JclSIMDTestBCBProject.bpr | 58 + .../debug/simdview/JclSIMDTestDelphi.dpr | 88 + .../experts/debug/simdview/JclSIMDUtils.pas | 888 + .../experts/debug/simdview/JclSIMDView.pas | 629 + .../debug/simdview/JclSIMDViewForm.dfm | 184 + .../debug/simdview/JclSIMDViewForm.pas | 951 + .../debug/threadnames/JclIdeThreadStatus.pas | 193 + .../threadnames/ThreadExpertSharedNames.pas | 337 + .../debug/threadnames/ThreadExpertUnit.pas | 401 + .../1.100/experts/debug/tools/MakeJclDbg.dof | 3 + .../1.100/experts/debug/tools/MakeJclDbg.dpr | 132 + .../1.100/experts/debug/tools/MapToJdbg.dof | 3 + .../1.100/experts/debug/tools/MapToJdbg.dpr | 14 + .../1.100/experts/debug/tools/MapToJdbg.res | Bin 0 -> 1812 bytes .../experts/debug/tools/MapToJdbgMain.dfm | 577 + .../experts/debug/tools/MapToJdbgMain.pas | 227 + .../1.100/experts/debug/tools/TlbToMap.dof | 3 + .../1.100/experts/debug/tools/TlbToMap.dpr | 14 + .../1.100/experts/debug/tools/TlbToMap.res | Bin 0 -> 1776 bytes .../experts/debug/tools/TlbToMapMain.dfm | 592 + .../experts/debug/tools/TlbToMapMain.pas | 390 + official/1.100/experts/debug/tools/Tools.bpg | 26 + .../1.100/experts/debug/tools/makejcldbg.res | Bin 0 -> 1792 bytes official/1.100/experts/favfolders/FavDlg.rc | 5 + official/1.100/experts/favfolders/FavDlg.res | Bin 0 -> 144 bytes .../favfolders/IdeOpenDlgFavoriteUnit.pas | 158 + .../experts/favfolders/OpenDlgFavAdapter.pas | 524 + .../projectanalyzer/ProjAnalyzerFrm.dfm | 872 + .../projectanalyzer/ProjAnalyzerFrm.pas | 651 + .../projectanalyzer/ProjAnalyzerIcon.res | Bin 0 -> 320 bytes .../projectanalyzer/ProjAnalyzerImpl.pas | 304 + .../1.100/experts/useswizard/Hardlinks.txt | 6 + official/1.100/experts/useswizard/History.txt | 25 + .../experts/useswizard/IdentifierList.dpr | 153 + .../experts/useswizard/JCLOptionsFrame.dfm | 59 + .../experts/useswizard/JCLOptionsFrame.pas | 129 + .../experts/useswizard/JCLUsesWizard.pas | 986 + official/1.100/experts/useswizard/Jcl8087.txt | 20 + .../useswizard/JclAbstractContainers.txt | 2 + .../experts/useswizard/JclAlgorithms.txt | 43 + .../experts/useswizard/JclAnsiStrings.txt | 167 + .../1.100/experts/useswizard/JclAppInst.txt | 12 + .../experts/useswizard/JclArrayLists.txt | 3 + .../1.100/experts/useswizard/JclArraySets.txt | 3 + official/1.100/experts/useswizard/JclBase.txt | 53 + .../experts/useswizard/JclBinaryTrees.txt | 10 + .../experts/useswizard/JclBorlandTools.txt | 118 + official/1.100/experts/useswizard/JclCIL.txt | 11 + official/1.100/experts/useswizard/JclCLR.txt | 38 + official/1.100/experts/useswizard/JclCOM.txt | 24 + .../1.100/experts/useswizard/JclComplex.txt | 8 + .../experts/useswizard/JclCompression.txt | 13 + .../1.100/experts/useswizard/JclConsole.txt | 25 + .../experts/useswizard/JclContainerIntf.txt | 44 + .../1.100/experts/useswizard/JclCounter.txt | 5 + .../1.100/experts/useswizard/JclDateTime.txt | 71 + .../1.100/experts/useswizard/JclDebug.txt | 123 + .../1.100/experts/useswizard/JclDotNet.txt | 57 + official/1.100/experts/useswizard/JclEDI.txt | 39 + .../1.100/experts/useswizard/JclEDISEF.txt | 136 + .../experts/useswizard/JclEDITranslators.txt | 2 + .../1.100/experts/useswizard/JclEDIXML.txt | 46 + .../experts/useswizard/JclEDI_ANSIX12.txt | 48 + .../experts/useswizard/JclEDI_ANSIX12_Ext.txt | 1 + .../experts/useswizard/JclEDI_UNEDIFACT.txt | 26 + .../useswizard/JclEDI_UNEDIFACT_Ext.txt | 2 + .../1.100/experts/useswizard/JclExprEval.txt | 54 + .../1.100/experts/useswizard/JclFileUtils.txt | 181 + .../experts/useswizard/JclGraphUtils.txt | 4 + .../1.100/experts/useswizard/JclGraphics.txt | 29 + .../1.100/experts/useswizard/JclHashMaps.txt | 31 + .../1.100/experts/useswizard/JclHashSets.txt | 3 + .../experts/useswizard/JclHookExcept.txt | 17 + .../1.100/experts/useswizard/JclIniFiles.txt | 8 + .../1.100/experts/useswizard/JclLANMan.txt | 23 + .../experts/useswizard/JclLinkedLists.txt | 9 + .../1.100/experts/useswizard/JclLocales.txt | 11 + .../1.100/experts/useswizard/JclLogic.txt | 185 + official/1.100/experts/useswizard/JclMIDI.txt | 119 + official/1.100/experts/useswizard/JclMapi.txt | 21 + official/1.100/experts/useswizard/JclMath.txt | 213 + .../1.100/experts/useswizard/JclMetadata.txt | 163 + official/1.100/experts/useswizard/JclMime.txt | 34 + .../1.100/experts/useswizard/JclMiscel.txt | 23 + .../1.100/experts/useswizard/JclMsdosSys.txt | 2 + .../experts/useswizard/JclMultimedia.txt | 31 + official/1.100/experts/useswizard/JclNTFS.txt | 48 + official/1.100/experts/useswizard/JclPCRE.txt | 10 + .../1.100/experts/useswizard/JclParseUses.pas | 885 + .../1.100/experts/useswizard/JclPeImage.txt | 94 + .../1.100/experts/useswizard/JclPrint.txt | 16 + .../experts/useswizard/JclQGraphUtils.txt | 129 + .../1.100/experts/useswizard/JclQGraphics.txt | 31 + .../1.100/experts/useswizard/JclQueues.txt | 3 + official/1.100/experts/useswizard/JclRTF.txt | 2 + official/1.100/experts/useswizard/JclRTTI.txt | 39 + .../1.100/experts/useswizard/JclRegistry.txt | 102 + .../1.100/experts/useswizard/JclResources.txt | 1441 + .../1.100/experts/useswizard/JclSchedule.txt | 21 + .../1.100/experts/useswizard/JclSecurity.txt | 13 + .../1.100/experts/useswizard/JclShell.txt | 72 + .../1.100/experts/useswizard/JclStacks.txt | 3 + .../experts/useswizard/JclStatistics.txt | 26 + .../experts/useswizard/JclStrHashMap.txt | 21 + .../1.100/experts/useswizard/JclStreams.txt | 14 + .../1.100/experts/useswizard/JclStrings.txt | 138 + .../experts/useswizard/JclStructStorage.txt | 6 + .../1.100/experts/useswizard/JclSvcCtrl.txt | 33 + .../1.100/experts/useswizard/JclSynch.txt | 50 + .../1.100/experts/useswizard/JclSysInfo.txt | 647 + .../1.100/experts/useswizard/JclSysUtils.txt | 122 + official/1.100/experts/useswizard/JclTD32.txt | 96 + official/1.100/experts/useswizard/JclTask.txt | 14 + .../1.100/experts/useswizard/JclUnicode.txt | 211 + .../1.100/experts/useswizard/JclUnitConv.txt | 135 + .../experts/useswizard/JclUnitVersioning.txt | 10 + .../useswizard/JclUnitVersioningProviders.txt | 4 + .../experts/useswizard/JclUsesDialog.dfm | 199 + .../experts/useswizard/JclUsesDialog.pas | 193 + .../experts/useswizard/JclValidation.txt | 1 + .../1.100/experts/useswizard/JclVectors.txt | 3 + .../experts/useswizard/JclWideFormat.txt | 1 + .../experts/useswizard/JclWideStrings.txt | 20 + .../1.100/experts/useswizard/JclWin32.txt | 1598 + .../1.100/experts/useswizard/JclWin32Ex.txt | 19 + .../1.100/experts/useswizard/JclWinMIDI.txt | 6 + .../experts/useswizard/JediUsesWizard.ini | 89 + official/1.100/experts/useswizard/ReadMe.txt | 23 + official/1.100/experts/useswizard/pcre.txt | 167 + .../versioncontrol/JclVersionCtrlCVSImpl.pas | 367 + .../JclVersionCtrlCommonOptions.dfm | 191 + .../JclVersionCtrlCommonOptions.pas | 564 + .../versioncontrol/JclVersionCtrlSVNImpl.pas | 426 + .../versioncontrol/VersionControlImpl.pas | 2155 ++ official/1.100/include/zconf.h | 332 + official/1.100/include/zlib.h | 1357 + official/1.100/include/zutil.h | 269 + official/1.100/install.sh | 17 + official/1.100/install/BCB5-dcc32.cfg.mak | 26 + .../1.100/install/ClxGui/QJediGUIInstall.xfm | 98 + .../1.100/install/ClxGui/QJediGUIMain.xfm | 587 + .../1.100/install/ClxGui/QJediGUIReadme.xfm | 16 + official/1.100/install/JclInstall.pas | 3491 ++ official/1.100/install/JediInstall.pas | 520 + .../1.100/install/JediInstallConfigIni.pas | 240 + official/1.100/install/JediInstaller.bdsproj | 174 + official/1.100/install/JediInstaller.dof | 15 + official/1.100/install/JediInstaller.dpr | 26 + official/1.100/install/JediInstaller.res | Bin 0 -> 876 bytes official/1.100/install/JediRegInfo.pas | 240 + official/1.100/install/QJediInstaller.conf | 35 + official/1.100/install/QJediInstaller.dof | 15 + official/1.100/install/QJediInstaller.dpr | 20 + official/1.100/install/QJediInstaller.kof | 61 + official/1.100/install/QJediInstaller.res | Bin 0 -> 1756 bytes official/1.100/install/RegHelper.dof | 4 + official/1.100/install/RegHelper.dpr | 331 + official/1.100/install/RegHelper.rc | 23 + official/1.100/install/RegHelper.res | Bin 0 -> 780 bytes official/1.100/install/VclGui/FrmCompile.dfm | 211 + official/1.100/install/VclGui/FrmCompile.pas | 289 + .../1.100/install/VclGui/JediGUIInstall.dfm | 104 + official/1.100/install/VclGui/JediGUIMain.dfm | 758 + .../1.100/install/VclGui/JediGUIReadme.dfm | 16 + official/1.100/install/build/build.bdsproj | 175 + official/1.100/install/build/build.dpr | 1261 + official/1.100/install/build/build.exe | Bin 0 -> 93184 bytes official/1.100/install/build/dcc32ex.dpr | 795 + official/1.100/install/build/dcc32ex.exe | Bin 0 -> 30208 bytes official/1.100/install/build/makefile.mak | 7 + official/1.100/install/build/pgEdit.xml | 138 + official/1.100/install/build/pretest.bat | 33 + official/1.100/install/makefile.mak | 62 + official/1.100/install/prototypes.mak | 41 + official/1.100/install/prototypes.sh | 18 + .../install/prototypes/JediGUIInstall.pas | 843 + .../1.100/install/prototypes/JediGUIMain.pas | 389 + .../install/prototypes/JediGUIReadme.pas | 126 + official/1.100/lib/c5/debug/dirinfo.txt | 1 + official/1.100/lib/c5/dirinfo.txt | 3 + official/1.100/lib/c5/obj/dirinfo.txt | 1 + official/1.100/lib/c5/windows.exc | 1 + official/1.100/lib/c6/debug/dirinfo.txt | 1 + official/1.100/lib/c6/dirinfo.txt | 3 + official/1.100/lib/c6/obj/dirinfo.txt | 1 + official/1.100/lib/c6/windows.exc | 1 + official/1.100/lib/cs1/dirinfo.txt | 1 + official/1.100/lib/d10.net/common.exc | 25 + official/1.100/lib/d10.net/debug/dirinfo.txt | 1 + official/1.100/lib/d10.net/dirinfo.txt | 1 + official/1.100/lib/d10.net/vcl.exc | 3 + official/1.100/lib/d10.net/windows.exc | 37 + official/1.100/lib/d10/debug/dirinfo.txt | 1 + official/1.100/lib/d10/dirinfo.txt | 1 + official/1.100/lib/d11/debug/dirinfo.txt | 1 + official/1.100/lib/d11/dirinfo.txt | 1 + official/1.100/lib/d5/debug/dirinfo.txt | 1 + official/1.100/lib/d5/dirinfo.txt | 3 + official/1.100/lib/d5/windows.exc | 0 official/1.100/lib/d6/debug/dirinfo.txt | 1 + official/1.100/lib/d6/dirinfo.txt | 1 + official/1.100/lib/d6/windows.exc | 0 official/1.100/lib/d7/debug/dirinfo.txt | 1 + official/1.100/lib/d7/dirinfo.txt | 1 + official/1.100/lib/d7/windows.exc | 0 official/1.100/lib/d8/dirinfo.txt | 1 + official/1.100/lib/d9.net/common.exc | 25 + official/1.100/lib/d9.net/debug/dirinfo.txt | 1 + official/1.100/lib/d9.net/dirinfo.txt | 1 + official/1.100/lib/d9.net/vcl.exc | 3 + official/1.100/lib/d9.net/windows.exc | 37 + official/1.100/lib/d9/debug/dirinfo.txt | 1 + official/1.100/lib/d9/dirinfo.txt | 1 + official/1.100/lib/d9/windows.exc | 0 official/1.100/lib/dirinfo.txt | 1 + official/1.100/lib/k3/debug/dirinfo.txt | 1 + official/1.100/lib/k3/dirinfo.txt | 1 + official/1.100/lib/k3/obj/dirinfo.txt | 1 + official/1.100/packages/BCB.bmk | 224 + .../packages/JclNetPackagesD100.bdsgroup | 19 + .../1.100/packages/JclNetPackagesD90.bdsgroup | 19 + official/1.100/packages/JclPackagesC50.bpg | 60 + official/1.100/packages/JclPackagesC60.bpg | 69 + official/1.100/packages/JclPackagesCK3.bpg | 24 + .../1.100/packages/JclPackagesD100.bdsgroup | 24 + .../1.100/packages/JclPackagesD110.bdsgroup | 24 + .../1.100/packages/JclPackagesD110.groupproj | 94 + official/1.100/packages/JclPackagesD50.bpg | 50 + official/1.100/packages/JclPackagesD60.bpg | 53 + official/1.100/packages/JclPackagesD70.bpg | 57 + .../1.100/packages/JclPackagesD90.bdsgroup | 26 + official/1.100/packages/JclPackagesDK3.bpg | 22 + official/1.100/packages/bcb.gmk | 187 + .../1.100/packages/c5/JclBaseExpertC50.bpk | 87 + .../1.100/packages/c5/JclBaseExpertC50.cpp | 35 + .../1.100/packages/c5/JclBaseExpertC50.dof | 5 + .../1.100/packages/c5/JclBaseExpertC50.dpk | 54 + .../1.100/packages/c5/JclBaseExpertC50.rc | 32 + .../1.100/packages/c5/JclBaseExpertC50.res | Bin 0 -> 956 bytes official/1.100/packages/c5/JclC50.bpk | 162 + official/1.100/packages/c5/JclC50.cpp | 115 + official/1.100/packages/c5/JclC50.dof | 5 + official/1.100/packages/c5/JclC50.dpk | 134 + official/1.100/packages/c5/JclC50.rc | 32 + official/1.100/packages/c5/JclC50.res | Bin 0 -> 872 bytes .../1.100/packages/c5/JclDebugExpertC50.RES | Bin 0 -> 904 bytes .../1.100/packages/c5/JclDebugExpertC50.bpk | 80 + .../1.100/packages/c5/JclDebugExpertC50.cpp | 31 + .../1.100/packages/c5/JclDebugExpertC50.dof | 5 + .../1.100/packages/c5/JclDebugExpertC50.dpk | 50 + .../1.100/packages/c5/JclDebugExpertC50.rc | 32 + .../packages/c5/JclDebugExpertDLLC50.bpf | 6 + .../packages/c5/JclDebugExpertDLLC50.bpr | 78 + .../packages/c5/JclDebugExpertDLLC50.cpp | 31 + .../packages/c5/JclDebugExpertDLLC50.dof | 9 + .../1.100/packages/c5/JclDebugExpertDLLC50.rc | 32 + .../packages/c5/JclDebugExpertDLLC50.res | Bin 0 -> 916 bytes .../c5/JclFavoriteFoldersExpertC50.bpk | 77 + .../c5/JclFavoriteFoldersExpertC50.cpp | 30 + .../c5/JclFavoriteFoldersExpertC50.dof | 5 + .../c5/JclFavoriteFoldersExpertC50.dpk | 49 + .../c5/JclFavoriteFoldersExpertC50.rc | 32 + .../c5/JclFavoriteFoldersExpertC50.res | Bin 0 -> 1000 bytes .../c5/JclFavoriteFoldersExpertDLLC50.bpf | 5 + .../c5/JclFavoriteFoldersExpertDLLC50.bpr | 75 + .../c5/JclFavoriteFoldersExpertDLLC50.cpp | 30 + .../c5/JclFavoriteFoldersExpertDLLC50.dof | 9 + .../c5/JclFavoriteFoldersExpertDLLC50.rc | 32 + .../c5/JclFavoriteFoldersExpertDLLC50.res | Bin 0 -> 1012 bytes .../c5/JclProjectAnalysisExpertC50.RES | Bin 0 -> 940 bytes .../c5/JclProjectAnalysisExpertC50.bpk | 78 + .../c5/JclProjectAnalysisExpertC50.cpp | 30 + .../c5/JclProjectAnalysisExpertC50.dof | 5 + .../c5/JclProjectAnalysisExpertC50.dpk | 49 + .../c5/JclProjectAnalysisExpertC50.rc | 32 + .../c5/JclProjectAnalysisExpertDLLC50.bpf | 5 + .../c5/JclProjectAnalysisExpertDLLC50.bpr | 76 + .../c5/JclProjectAnalysisExpertDLLC50.cpp | 30 + .../c5/JclProjectAnalysisExpertDLLC50.dof | 9 + .../c5/JclProjectAnalysisExpertDLLC50.rc | 32 + .../c5/JclProjectAnalysisExpertDLLC50.res | Bin 0 -> 952 bytes .../packages/c5/JclRepositoryExpertC50.bpk | 91 + .../packages/c5/JclRepositoryExpertC50.cpp | 38 + .../packages/c5/JclRepositoryExpertC50.dof | 5 + .../packages/c5/JclRepositoryExpertC50.dpk | 57 + .../packages/c5/JclRepositoryExpertC50.rc | 32 + .../packages/c5/JclRepositoryExpertC50.res | Bin 0 -> 960 bytes .../packages/c5/JclRepositoryExpertDLLC50.bpf | 13 + .../packages/c5/JclRepositoryExpertDLLC50.bpr | 89 + .../packages/c5/JclRepositoryExpertDLLC50.cpp | 38 + .../packages/c5/JclRepositoryExpertDLLC50.dof | 9 + .../packages/c5/JclRepositoryExpertDLLC50.rc | 32 + .../packages/c5/JclRepositoryExpertDLLC50.res | Bin 0 -> 972 bytes .../packages/c5/JclSIMDViewExpertC50.bpk | 83 + .../packages/c5/JclSIMDViewExpertC50.cpp | 33 + .../packages/c5/JclSIMDViewExpertC50.dof | 5 + .../packages/c5/JclSIMDViewExpertC50.dpk | 52 + .../1.100/packages/c5/JclSIMDViewExpertC50.rc | 32 + .../packages/c5/JclSIMDViewExpertC50.res | Bin 0 -> 936 bytes .../packages/c5/JclSIMDViewExpertDLLC50.bpf | 8 + .../packages/c5/JclSIMDViewExpertDLLC50.bpr | 81 + .../packages/c5/JclSIMDViewExpertDLLC50.cpp | 33 + .../packages/c5/JclSIMDViewExpertDLLC50.dof | 9 + .../packages/c5/JclSIMDViewExpertDLLC50.rc | 32 + .../packages/c5/JclSIMDViewExpertDLLC50.res | Bin 0 -> 948 bytes .../packages/c5/JclThreadNameExpertC50.RES | Bin 0 -> 932 bytes .../packages/c5/JclThreadNameExpertC50.bpk | 77 + .../packages/c5/JclThreadNameExpertC50.cpp | 30 + .../packages/c5/JclThreadNameExpertC50.dof | 5 + .../packages/c5/JclThreadNameExpertC50.dpk | 49 + .../packages/c5/JclThreadNameExpertC50.rc | 32 + .../packages/c5/JclThreadNameExpertDLLC50.bpf | 5 + .../packages/c5/JclThreadNameExpertDLLC50.bpr | 75 + .../packages/c5/JclThreadNameExpertDLLC50.cpp | 30 + .../packages/c5/JclThreadNameExpertDLLC50.dof | 9 + .../packages/c5/JclThreadNameExpertDLLC50.rc | 32 + .../packages/c5/JclThreadNameExpertDLLC50.res | Bin 0 -> 944 bytes .../1.100/packages/c5/JclUsesExpertC50.RES | Bin 0 -> 884 bytes .../1.100/packages/c5/JclUsesExpertC50.bpk | 81 + .../1.100/packages/c5/JclUsesExpertC50.cpp | 32 + .../1.100/packages/c5/JclUsesExpertC50.dof | 5 + .../1.100/packages/c5/JclUsesExpertC50.dpk | 51 + .../1.100/packages/c5/JclUsesExpertC50.rc | 32 + .../1.100/packages/c5/JclUsesExpertDLLC50.bpf | 7 + .../1.100/packages/c5/JclUsesExpertDLLC50.bpr | 79 + .../1.100/packages/c5/JclUsesExpertDLLC50.cpp | 32 + .../1.100/packages/c5/JclUsesExpertDLLC50.dof | 9 + .../1.100/packages/c5/JclUsesExpertDLLC50.rc | 32 + .../1.100/packages/c5/JclUsesExpertDLLC50.res | Bin 0 -> 896 bytes .../c5/JclVersionControlExpertC50.bpk | 80 + .../c5/JclVersionControlExpertC50.cpp | 32 + .../c5/JclVersionControlExpertC50.dof | 5 + .../c5/JclVersionControlExpertC50.dpk | 51 + .../packages/c5/JclVersionControlExpertC50.rc | 32 + .../c5/JclVersionControlExpertC50.res | Bin 0 -> 1000 bytes .../c5/JclVersionControlExpertDLLC50.bpf | 7 + .../c5/JclVersionControlExpertDLLC50.bpr | 78 + .../c5/JclVersionControlExpertDLLC50.cpp | 32 + .../c5/JclVersionControlExpertDLLC50.dof | 9 + .../c5/JclVersionControlExpertDLLC50.rc | 32 + .../c5/JclVersionControlExpertDLLC50.res | Bin 0 -> 1012 bytes official/1.100/packages/c5/dirinfo.txt | 1 + official/1.100/packages/c5/template.bpf | 20 + official/1.100/packages/c5/template.bpk | 89 + official/1.100/packages/c5/template.bpr | 90 + official/1.100/packages/c5/template.cpp | 68 + official/1.100/packages/c5/template.dof | 11 + official/1.100/packages/c5/template.dpk | 55 + official/1.100/packages/c5/template.rc | 32 + official/1.100/packages/c6/Jcl.RES | Bin 0 -> 860 bytes official/1.100/packages/c6/Jcl.bpk | 250 + official/1.100/packages/c6/Jcl.cpp | 25 + official/1.100/packages/c6/Jcl.dof | 5 + official/1.100/packages/c6/Jcl.dpk | 129 + official/1.100/packages/c6/Jcl.rc | 32 + official/1.100/packages/c6/JclBaseExpert.bpk | 105 + official/1.100/packages/c6/JclBaseExpert.cpp | 30 + official/1.100/packages/c6/JclBaseExpert.dof | 5 + official/1.100/packages/c6/JclBaseExpert.dpk | 54 + official/1.100/packages/c6/JclBaseExpert.rc | 32 + official/1.100/packages/c6/JclBaseExpert.res | Bin 0 -> 944 bytes official/1.100/packages/c6/JclDebugExpert.RES | Bin 0 -> 892 bytes official/1.100/packages/c6/JclDebugExpert.bpk | 94 + official/1.100/packages/c6/JclDebugExpert.cpp | 27 + official/1.100/packages/c6/JclDebugExpert.dof | 5 + official/1.100/packages/c6/JclDebugExpert.dpk | 50 + official/1.100/packages/c6/JclDebugExpert.rc | 32 + .../1.100/packages/c6/JclDebugExpertDLL.bpf | 6 + .../1.100/packages/c6/JclDebugExpertDLL.bpr | 92 + .../1.100/packages/c6/JclDebugExpertDLL.cpp | 27 + .../1.100/packages/c6/JclDebugExpertDLL.dof | 9 + .../1.100/packages/c6/JclDebugExpertDLL.rc | 32 + .../1.100/packages/c6/JclDebugExpertDLL.res | Bin 0 -> 904 bytes .../packages/c6/JclFavoriteFoldersExpert.RES | Bin 0 -> 988 bytes .../packages/c6/JclFavoriteFoldersExpert.bpk | 90 + .../packages/c6/JclFavoriteFoldersExpert.cpp | 25 + .../packages/c6/JclFavoriteFoldersExpert.dof | 5 + .../packages/c6/JclFavoriteFoldersExpert.dpk | 49 + .../packages/c6/JclFavoriteFoldersExpert.rc | 32 + .../c6/JclFavoriteFoldersExpertDLL.bpf | 5 + .../c6/JclFavoriteFoldersExpertDLL.bpr | 88 + .../c6/JclFavoriteFoldersExpertDLL.cpp | 25 + .../c6/JclFavoriteFoldersExpertDLL.dof | 9 + .../c6/JclFavoriteFoldersExpertDLL.rc | 32 + .../c6/JclFavoriteFoldersExpertDLL.res | Bin 0 -> 1000 bytes .../packages/c6/JclProjectAnalysisExpert.RES | Bin 0 -> 928 bytes .../packages/c6/JclProjectAnalysisExpert.bpk | 91 + .../packages/c6/JclProjectAnalysisExpert.cpp | 26 + .../packages/c6/JclProjectAnalysisExpert.dof | 5 + .../packages/c6/JclProjectAnalysisExpert.dpk | 49 + .../packages/c6/JclProjectAnalysisExpert.rc | 32 + .../c6/JclProjectAnalysisExpertDLL.bpf | 5 + .../c6/JclProjectAnalysisExpertDLL.bpr | 89 + .../c6/JclProjectAnalysisExpertDLL.cpp | 26 + .../c6/JclProjectAnalysisExpertDLL.dof | 9 + .../c6/JclProjectAnalysisExpertDLL.rc | 32 + .../c6/JclProjectAnalysisExpertDLL.res | Bin 0 -> 940 bytes .../1.100/packages/c6/JclRepositoryExpert.bpk | 112 + .../1.100/packages/c6/JclRepositoryExpert.cpp | 31 + .../1.100/packages/c6/JclRepositoryExpert.dof | 5 + .../1.100/packages/c6/JclRepositoryExpert.dpk | 57 + .../1.100/packages/c6/JclRepositoryExpert.rc | 32 + .../1.100/packages/c6/JclRepositoryExpert.res | Bin 0 -> 948 bytes .../packages/c6/JclRepositoryExpertDLL.bpf | 13 + .../packages/c6/JclRepositoryExpertDLL.bpr | 110 + .../packages/c6/JclRepositoryExpertDLL.cpp | 31 + .../packages/c6/JclRepositoryExpertDLL.dof | 9 + .../packages/c6/JclRepositoryExpertDLL.rc | 32 + .../packages/c6/JclRepositoryExpertDLL.res | Bin 0 -> 960 bytes .../1.100/packages/c6/JclSIMDViewExpert.bpk | 99 + .../1.100/packages/c6/JclSIMDViewExpert.cpp | 28 + .../1.100/packages/c6/JclSIMDViewExpert.dof | 5 + .../1.100/packages/c6/JclSIMDViewExpert.dpk | 52 + .../1.100/packages/c6/JclSIMDViewExpert.rc | 32 + .../1.100/packages/c6/JclSIMDViewExpert.res | Bin 0 -> 924 bytes .../packages/c6/JclSIMDViewExpertDLL.bpf | 8 + .../packages/c6/JclSIMDViewExpertDLL.bpr | 97 + .../packages/c6/JclSIMDViewExpertDLL.cpp | 28 + .../packages/c6/JclSIMDViewExpertDLL.dof | 9 + .../1.100/packages/c6/JclSIMDViewExpertDLL.rc | 32 + .../packages/c6/JclSIMDViewExpertDLL.res | Bin 0 -> 936 bytes .../1.100/packages/c6/JclThreadNameExpert.RES | Bin 0 -> 920 bytes .../1.100/packages/c6/JclThreadNameExpert.bpk | 90 + .../1.100/packages/c6/JclThreadNameExpert.cpp | 25 + .../1.100/packages/c6/JclThreadNameExpert.dof | 5 + .../1.100/packages/c6/JclThreadNameExpert.dpk | 49 + .../1.100/packages/c6/JclThreadNameExpert.rc | 32 + .../packages/c6/JclThreadNameExpertDLL.bpf | 5 + .../packages/c6/JclThreadNameExpertDLL.bpr | 88 + .../packages/c6/JclThreadNameExpertDLL.cpp | 25 + .../packages/c6/JclThreadNameExpertDLL.dof | 9 + .../packages/c6/JclThreadNameExpertDLL.rc | 32 + .../packages/c6/JclThreadNameExpertDLL.res | Bin 0 -> 932 bytes official/1.100/packages/c6/JclUsesExpert.RES | Bin 0 -> 872 bytes official/1.100/packages/c6/JclUsesExpert.bpk | 96 + official/1.100/packages/c6/JclUsesExpert.cpp | 27 + official/1.100/packages/c6/JclUsesExpert.dof | 5 + official/1.100/packages/c6/JclUsesExpert.dpk | 51 + official/1.100/packages/c6/JclUsesExpert.rc | 32 + .../1.100/packages/c6/JclUsesExpertDLL.bpf | 7 + .../1.100/packages/c6/JclUsesExpertDLL.bpr | 94 + .../1.100/packages/c6/JclUsesExpertDLL.cpp | 27 + .../1.100/packages/c6/JclUsesExpertDLL.dof | 9 + .../1.100/packages/c6/JclUsesExpertDLL.rc | 32 + .../1.100/packages/c6/JclUsesExpertDLL.res | Bin 0 -> 884 bytes official/1.100/packages/c6/JclVClx.RES | Bin 0 -> 888 bytes official/1.100/packages/c6/JclVClx.bpk | 86 + official/1.100/packages/c6/JclVClx.cpp | 25 + official/1.100/packages/c6/JclVClx.dof | 5 + official/1.100/packages/c6/JclVClx.dpk | 47 + official/1.100/packages/c6/JclVClx.rc | 32 + official/1.100/packages/c6/JclVcl.RES | Bin 0 -> 872 bytes official/1.100/packages/c6/JclVcl.bpk | 90 + official/1.100/packages/c6/JclVcl.cpp | 25 + official/1.100/packages/c6/JclVcl.dof | 5 + official/1.100/packages/c6/JclVcl.dpk | 49 + official/1.100/packages/c6/JclVcl.rc | 32 + .../packages/c6/JclVersionControlExpert.bpk | 95 + .../packages/c6/JclVersionControlExpert.cpp | 26 + .../packages/c6/JclVersionControlExpert.dof | 5 + .../packages/c6/JclVersionControlExpert.dpk | 51 + .../packages/c6/JclVersionControlExpert.rc | 32 + .../packages/c6/JclVersionControlExpert.res | Bin 0 -> 988 bytes .../c6/JclVersionControlExpertDLL.bpf | 7 + .../c6/JclVersionControlExpertDLL.bpr | 93 + .../c6/JclVersionControlExpertDLL.cpp | 26 + .../c6/JclVersionControlExpertDLL.dof | 9 + .../packages/c6/JclVersionControlExpertDLL.rc | 32 + .../c6/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/c6/dirinfo.txt | 1 + official/1.100/packages/c6/template.bpf | 20 + official/1.100/packages/c6/template.bpk | 103 + official/1.100/packages/c6/template.bpr | 104 + official/1.100/packages/c6/template.cpp | 66 + official/1.100/packages/c6/template.dof | 11 + official/1.100/packages/c6/template.dpk | 54 + official/1.100/packages/c6/template.rc | 32 + official/1.100/packages/cs1/Jcl.RES | Bin 0 -> 856 bytes official/1.100/packages/cs1/Jcl.bdsproj | 174 + official/1.100/packages/cs1/Jcl.dpk | 131 + official/1.100/packages/cs1/Jcl.rc | 32 + official/1.100/packages/cs1/JclBaseExpert.RES | Bin 0 -> 940 bytes .../1.100/packages/cs1/JclBaseExpert.bdsproj | 174 + official/1.100/packages/cs1/JclBaseExpert.dpk | 56 + official/1.100/packages/cs1/JclBaseExpert.rc | 32 + .../cs1/JclFavoriteFoldersExpertDLL.RES | Bin 0 -> 996 bytes .../cs1/JclFavoriteFoldersExpertDLL.bdsproj | 174 + .../cs1/JclFavoriteFoldersExpertDLL.dpr | 46 + .../cs1/JclFavoriteFoldersExpertDLL.rc | 32 + .../cs1/JclVersionControlExpertDLL.bdsproj | 174 + .../cs1/JclVersionControlExpertDLL.dpr | 48 + .../cs1/JclVersionControlExpertDLL.rc | 32 + .../cs1/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/cs1/template.bdsproj | 174 + official/1.100/packages/cs1/template.dpk | 56 + official/1.100/packages/cs1/template.dpr | 60 + official/1.100/packages/cs1/template.rc | 32 + .../1.100/packages/d10.net/Jedi.Jcl.bdsproj | 213 + official/1.100/packages/d10.net/Jedi.Jcl.dpr | 64 + .../1.100/packages/d10.net/template.bdsproj | 188 + official/1.100/packages/d10.net/template.dpr | 39 + official/1.100/packages/d10/Jcl.bdsproj | 163 + official/1.100/packages/d10/Jcl.dpk | 135 + official/1.100/packages/d10/Jcl.rc | 32 + official/1.100/packages/d10/Jcl.res | Bin 0 -> 860 bytes .../1.100/packages/d10/JclBaseExpert.bdsproj | 163 + official/1.100/packages/d10/JclBaseExpert.dpk | 56 + official/1.100/packages/d10/JclBaseExpert.rc | 32 + official/1.100/packages/d10/JclBaseExpert.res | Bin 0 -> 944 bytes .../1.100/packages/d10/JclDebugExpert.bdsproj | 163 + .../1.100/packages/d10/JclDebugExpert.dpk | 52 + official/1.100/packages/d10/JclDebugExpert.rc | 32 + .../1.100/packages/d10/JclDebugExpert.res | Bin 0 -> 892 bytes .../packages/d10/JclDebugExpertDLL.bdsproj | 163 + .../1.100/packages/d10/JclDebugExpertDLL.dpr | 47 + .../1.100/packages/d10/JclDebugExpertDLL.rc | 32 + .../1.100/packages/d10/JclDebugExpertDLL.res | Bin 0 -> 904 bytes .../1.100/packages/d10/JclExperts.bdsgroup | 22 + .../d10/JclFavoriteFoldersExpert.bdsproj | 163 + .../packages/d10/JclFavoriteFoldersExpert.dpk | 51 + .../packages/d10/JclFavoriteFoldersExpert.rc | 32 + .../packages/d10/JclFavoriteFoldersExpert.res | Bin 0 -> 988 bytes .../d10/JclFavoriteFoldersExpertDLL.bdsproj | 163 + .../d10/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d10/JclFavoriteFoldersExpertDLL.rc | 32 + .../d10/JclFavoriteFoldersExpertDLL.res | Bin 0 -> 1000 bytes .../packages/d10/JclProjectAnalysisExpert.RES | Bin 0 -> 928 bytes .../d10/JclProjectAnalysisExpert.bdsproj | 163 + .../packages/d10/JclProjectAnalysisExpert.dpk | 51 + .../packages/d10/JclProjectAnalysisExpert.rc | 32 + .../d10/JclProjectAnalysisExpertDLL.bdsproj | 163 + .../d10/JclProjectAnalysisExpertDLL.dpr | 46 + .../d10/JclProjectAnalysisExpertDLL.rc | 32 + .../d10/JclProjectAnalysisExpertDLL.res | Bin 0 -> 940 bytes .../packages/d10/JclRepositoryExpert.bdsproj | 163 + .../packages/d10/JclRepositoryExpert.dpk | 59 + .../1.100/packages/d10/JclRepositoryExpert.rc | 32 + .../packages/d10/JclRepositoryExpert.res | Bin 0 -> 948 bytes .../d10/JclRepositoryExpertDLL.bdsproj | 163 + .../packages/d10/JclRepositoryExpertDLL.dpr | 54 + .../packages/d10/JclRepositoryExpertDLL.rc | 32 + .../packages/d10/JclRepositoryExpertDLL.res | Bin 0 -> 960 bytes .../packages/d10/JclSIMDViewExpert.bdsproj | 163 + .../1.100/packages/d10/JclSIMDViewExpert.dpk | 54 + .../1.100/packages/d10/JclSIMDViewExpert.rc | 32 + .../1.100/packages/d10/JclSIMDViewExpert.res | Bin 0 -> 924 bytes .../packages/d10/JclSIMDViewExpertDLL.bdsproj | 163 + .../packages/d10/JclSIMDViewExpertDLL.dpr | 49 + .../packages/d10/JclSIMDViewExpertDLL.rc | 32 + .../packages/d10/JclSIMDViewExpertDLL.res | Bin 0 -> 936 bytes .../packages/d10/JclThreadNameExpert.bdsproj | 163 + .../packages/d10/JclThreadNameExpert.dpk | 51 + .../1.100/packages/d10/JclThreadNameExpert.rc | 32 + .../packages/d10/JclThreadNameExpert.res | Bin 0 -> 920 bytes .../d10/JclThreadNameExpertDLL.bdsproj | 163 + .../packages/d10/JclThreadNameExpertDLL.dpr | 46 + .../packages/d10/JclThreadNameExpertDLL.rc | 32 + .../packages/d10/JclThreadNameExpertDLL.res | Bin 0 -> 932 bytes official/1.100/packages/d10/JclVcl.bdsproj | 163 + official/1.100/packages/d10/JclVcl.dpk | 51 + official/1.100/packages/d10/JclVcl.rc | 32 + official/1.100/packages/d10/JclVcl.res | Bin 0 -> 872 bytes .../d10/JclVersionControlExpert.bdsproj | 163 + .../packages/d10/JclVersionControlExpert.dpk | 53 + .../packages/d10/JclVersionControlExpert.rc | 32 + .../packages/d10/JclVersionControlExpert.res | Bin 0 -> 988 bytes .../d10/JclVersionControlExpertDLL.bdsproj | 163 + .../d10/JclVersionControlExpertDLL.dpr | 48 + .../d10/JclVersionControlExpertDLL.rc | 32 + .../d10/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/d10/template.bdsproj | 163 + official/1.100/packages/d10/template.dpk | 56 + official/1.100/packages/d10/template.dpr | 58 + official/1.100/packages/d10/template.rc | 32 + official/1.100/packages/d11/Jcl.dpk | 135 + official/1.100/packages/d11/Jcl.dproj | 90 + official/1.100/packages/d11/Jcl.rc | 32 + official/1.100/packages/d11/Jcl.res | Bin 0 -> 860 bytes official/1.100/packages/d11/JclBaseExpert.dpk | 56 + .../1.100/packages/d11/JclBaseExpert.dproj | 90 + official/1.100/packages/d11/JclBaseExpert.rc | 32 + official/1.100/packages/d11/JclBaseExpert.res | Bin 0 -> 944 bytes .../1.100/packages/d11/JclDebugExpert.dpk | 52 + .../1.100/packages/d11/JclDebugExpert.dproj | 90 + official/1.100/packages/d11/JclDebugExpert.rc | 32 + .../1.100/packages/d11/JclDebugExpert.res | Bin 0 -> 892 bytes .../1.100/packages/d11/JclDebugExpertDLL.dpr | 47 + .../packages/d11/JclDebugExpertDLL.dproj | 90 + .../1.100/packages/d11/JclDebugExpertDLL.rc | 32 + .../packages/d11/JclFavoriteFoldersExpert.dpk | 51 + .../d11/JclFavoriteFoldersExpert.dproj | 90 + .../packages/d11/JclFavoriteFoldersExpert.rc | 32 + .../packages/d11/JclFavoriteFoldersExpert.res | Bin 0 -> 988 bytes .../d11/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d11/JclFavoriteFoldersExpertDLL.dproj | 90 + .../d11/JclFavoriteFoldersExpertDLL.rc | 32 + .../packages/d11/JclProjectAnalysisExpert.dpk | 51 + .../d11/JclProjectAnalysisExpert.dproj | 90 + .../packages/d11/JclProjectAnalysisExpert.rc | 32 + .../packages/d11/JclProjectAnalysisExpert.res | Bin 0 -> 928 bytes .../d11/JclProjectAnalysisExpertDLL.dpr | 46 + .../d11/JclProjectAnalysisExpertDLL.dproj | 90 + .../d11/JclProjectAnalysisExpertDLL.rc | 32 + .../packages/d11/JclRepositoryExpert.dpk | 59 + .../packages/d11/JclRepositoryExpert.dproj | 90 + .../1.100/packages/d11/JclRepositoryExpert.rc | 32 + .../packages/d11/JclRepositoryExpert.res | Bin 0 -> 948 bytes .../packages/d11/JclRepositoryExpertDLL.dpr | 54 + .../packages/d11/JclRepositoryExpertDLL.dproj | 90 + .../packages/d11/JclRepositoryExpertDLL.rc | 32 + .../1.100/packages/d11/JclSIMDViewExpert.dpk | 54 + .../packages/d11/JclSIMDViewExpert.dproj | 90 + .../1.100/packages/d11/JclSIMDViewExpert.rc | 32 + .../1.100/packages/d11/JclSIMDViewExpert.res | Bin 0 -> 924 bytes .../packages/d11/JclSIMDViewExpertDLL.dpr | 49 + .../packages/d11/JclSIMDViewExpertDLL.dproj | 90 + .../packages/d11/JclSIMDViewExpertDLL.rc | 32 + .../packages/d11/JclThreadNameExpert.dpk | 51 + .../packages/d11/JclThreadNameExpert.dproj | 90 + .../1.100/packages/d11/JclThreadNameExpert.rc | 32 + .../packages/d11/JclThreadNameExpert.res | Bin 0 -> 920 bytes .../packages/d11/JclThreadNameExpertDLL.dpr | 46 + .../packages/d11/JclThreadNameExpertDLL.dproj | 90 + .../packages/d11/JclThreadNameExpertDLL.rc | 32 + official/1.100/packages/d11/JclVcl.dpk | 51 + official/1.100/packages/d11/JclVcl.dproj | 90 + official/1.100/packages/d11/JclVcl.rc | 32 + official/1.100/packages/d11/JclVcl.res | Bin 0 -> 872 bytes .../packages/d11/JclVersionControlExpert.dpk | 53 + .../d11/JclVersionControlExpert.dproj | 90 + .../packages/d11/JclVersionControlExpert.rc | 32 + .../packages/d11/JclVersionControlExpert.res | Bin 0 -> 988 bytes .../d11/JclVersionControlExpertDLL.dpr | 48 + .../d11/JclVersionControlExpertDLL.dproj | 90 + .../d11/JclVersionControlExpertDLL.rc | 32 + official/1.100/packages/d11/template.dpk | 56 + official/1.100/packages/d11/template.dpr | 58 + official/1.100/packages/d11/template.dproj | 90 + official/1.100/packages/d11/template.rc | 32 + .../1.100/packages/d5/JclBaseExpertD50.dof | 4 + .../1.100/packages/d5/JclBaseExpertD50.dpk | 54 + .../1.100/packages/d5/JclBaseExpertD50.rc | 32 + .../1.100/packages/d5/JclBaseExpertD50.res | Bin 0 -> 956 bytes official/1.100/packages/d5/JclD50.RES | Bin 0 -> 872 bytes official/1.100/packages/d5/JclD50.dof | 4 + official/1.100/packages/d5/JclD50.dpk | 138 + official/1.100/packages/d5/JclD50.rc | 32 + .../1.100/packages/d5/JclDebugExpertD50.RES | Bin 0 -> 904 bytes .../1.100/packages/d5/JclDebugExpertD50.dof | 4 + .../1.100/packages/d5/JclDebugExpertD50.dpk | 50 + .../1.100/packages/d5/JclDebugExpertD50.rc | 32 + .../packages/d5/JclDebugExpertDLLD50.RES | Bin 0 -> 916 bytes .../packages/d5/JclDebugExpertDLLD50.dof | 8 + .../packages/d5/JclDebugExpertDLLD50.dpr | 46 + .../1.100/packages/d5/JclDebugExpertDLLD50.rc | 32 + .../d5/JclFavoriteFoldersExpertD50.RES | Bin 0 -> 1000 bytes .../d5/JclFavoriteFoldersExpertD50.dof | 4 + .../d5/JclFavoriteFoldersExpertD50.dpk | 49 + .../d5/JclFavoriteFoldersExpertD50.rc | 32 + .../d5/JclFavoriteFoldersExpertDLLD50.RES | Bin 0 -> 1012 bytes .../d5/JclFavoriteFoldersExpertDLLD50.dof | 8 + .../d5/JclFavoriteFoldersExpertDLLD50.dpr | 45 + .../d5/JclFavoriteFoldersExpertDLLD50.rc | 32 + .../d5/JclProjectAnalysisExpertD50.RES | Bin 0 -> 940 bytes .../d5/JclProjectAnalysisExpertD50.dof | 4 + .../d5/JclProjectAnalysisExpertD50.dpk | 49 + .../d5/JclProjectAnalysisExpertD50.rc | 32 + .../d5/JclProjectAnalysisExpertDLLD50.RES | Bin 0 -> 952 bytes .../d5/JclProjectAnalysisExpertDLLD50.dof | 8 + .../d5/JclProjectAnalysisExpertDLLD50.dpr | 45 + .../d5/JclProjectAnalysisExpertDLLD50.rc | 32 + .../packages/d5/JclRepositoryExpertD50.dof | 4 + .../packages/d5/JclRepositoryExpertD50.dpk | 57 + .../packages/d5/JclRepositoryExpertD50.rc | 32 + .../packages/d5/JclRepositoryExpertD50.res | Bin 0 -> 960 bytes .../packages/d5/JclRepositoryExpertDLLD50.dof | 8 + .../packages/d5/JclRepositoryExpertDLLD50.dpr | 53 + .../packages/d5/JclRepositoryExpertDLLD50.rc | 32 + .../packages/d5/JclRepositoryExpertDLLD50.res | Bin 0 -> 972 bytes .../packages/d5/JclSIMDViewExpertD50.RES | Bin 0 -> 936 bytes .../packages/d5/JclSIMDViewExpertD50.dof | 4 + .../packages/d5/JclSIMDViewExpertD50.dpk | 52 + .../1.100/packages/d5/JclSIMDViewExpertD50.rc | 32 + .../packages/d5/JclSIMDViewExpertDLLD50.RES | Bin 0 -> 948 bytes .../packages/d5/JclSIMDViewExpertDLLD50.dof | 8 + .../packages/d5/JclSIMDViewExpertDLLD50.dpr | 48 + .../packages/d5/JclSIMDViewExpertDLLD50.rc | 32 + .../packages/d5/JclThreadNameExpertD50.RES | Bin 0 -> 932 bytes .../packages/d5/JclThreadNameExpertD50.dof | 4 + .../packages/d5/JclThreadNameExpertD50.dpk | 49 + .../packages/d5/JclThreadNameExpertD50.rc | 32 + .../packages/d5/JclThreadNameExpertDLLD50.RES | Bin 0 -> 944 bytes .../packages/d5/JclThreadNameExpertDLLD50.dof | 8 + .../packages/d5/JclThreadNameExpertDLLD50.dpr | 45 + .../packages/d5/JclThreadNameExpertDLLD50.rc | 32 + .../1.100/packages/d5/JclUsesExpertD50.RES | Bin 0 -> 884 bytes .../1.100/packages/d5/JclUsesExpertD50.dof | 4 + .../1.100/packages/d5/JclUsesExpertD50.dpk | 51 + .../1.100/packages/d5/JclUsesExpertD50.rc | 32 + .../1.100/packages/d5/JclUsesExpertDLLD50.RES | Bin 0 -> 896 bytes .../1.100/packages/d5/JclUsesExpertDLLD50.dof | 8 + .../1.100/packages/d5/JclUsesExpertDLLD50.dpr | 47 + .../1.100/packages/d5/JclUsesExpertDLLD50.rc | 32 + .../d5/JclVersionControlExpertD50.dof | 4 + .../d5/JclVersionControlExpertD50.dpk | 51 + .../packages/d5/JclVersionControlExpertD50.rc | 32 + .../d5/JclVersionControlExpertD50.res | Bin 0 -> 1000 bytes .../d5/JclVersionControlExpertDLLD50.dof | 8 + .../d5/JclVersionControlExpertDLLD50.dpr | 47 + .../d5/JclVersionControlExpertDLLD50.rc | 32 + .../d5/JclVersionControlExpertDLLD50.res | Bin 0 -> 1012 bytes official/1.100/packages/d5/dirinfo.txt | 1 + official/1.100/packages/d5/template.dof | 10 + official/1.100/packages/d5/template.dpk | 55 + official/1.100/packages/d5/template.dpr | 57 + official/1.100/packages/d5/template.rc | 32 + official/1.100/packages/d6/Jcl.dof | 4 + official/1.100/packages/d6/Jcl.dpk | 135 + official/1.100/packages/d6/Jcl.rc | 32 + official/1.100/packages/d6/Jcl.res | Bin 0 -> 860 bytes official/1.100/packages/d6/JclBaseExpert.dof | 4 + official/1.100/packages/d6/JclBaseExpert.dpk | 56 + official/1.100/packages/d6/JclBaseExpert.rc | 32 + official/1.100/packages/d6/JclBaseExpert.res | Bin 0 -> 944 bytes official/1.100/packages/d6/JclDebugExpert.dof | 4 + official/1.100/packages/d6/JclDebugExpert.dpk | 52 + official/1.100/packages/d6/JclDebugExpert.rc | 32 + official/1.100/packages/d6/JclDebugExpert.res | Bin 0 -> 892 bytes .../1.100/packages/d6/JclDebugExpertDLL.RES | Bin 0 -> 904 bytes .../1.100/packages/d6/JclDebugExpertDLL.dof | 8 + .../1.100/packages/d6/JclDebugExpertDLL.dpr | 47 + .../1.100/packages/d6/JclDebugExpertDLL.rc | 32 + .../packages/d6/JclFavoriteFoldersExpert.dof | 4 + .../packages/d6/JclFavoriteFoldersExpert.dpk | 51 + .../packages/d6/JclFavoriteFoldersExpert.rc | 32 + .../packages/d6/JclFavoriteFoldersExpert.res | Bin 0 -> 988 bytes .../d6/JclFavoriteFoldersExpertDLL.RES | Bin 0 -> 1000 bytes .../d6/JclFavoriteFoldersExpertDLL.dof | 8 + .../d6/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d6/JclFavoriteFoldersExpertDLL.rc | 32 + .../packages/d6/JclProjectAnalysisExpert.RES | Bin 0 -> 928 bytes .../packages/d6/JclProjectAnalysisExpert.dof | 4 + .../packages/d6/JclProjectAnalysisExpert.dpk | 51 + .../packages/d6/JclProjectAnalysisExpert.rc | 32 + .../d6/JclProjectAnalysisExpertDLL.RES | Bin 0 -> 940 bytes .../d6/JclProjectAnalysisExpertDLL.dof | 8 + .../d6/JclProjectAnalysisExpertDLL.dpr | 46 + .../d6/JclProjectAnalysisExpertDLL.rc | 32 + .../1.100/packages/d6/JclRepositoryExpert.dof | 4 + .../1.100/packages/d6/JclRepositoryExpert.dpk | 59 + .../1.100/packages/d6/JclRepositoryExpert.rc | 32 + .../1.100/packages/d6/JclRepositoryExpert.res | Bin 0 -> 948 bytes .../packages/d6/JclRepositoryExpertDLL.dof | 8 + .../packages/d6/JclRepositoryExpertDLL.dpr | 54 + .../packages/d6/JclRepositoryExpertDLL.rc | 32 + .../packages/d6/JclRepositoryExpertDLL.res | Bin 0 -> 960 bytes .../1.100/packages/d6/JclSIMDViewExpert.dof | 4 + .../1.100/packages/d6/JclSIMDViewExpert.dpk | 54 + .../1.100/packages/d6/JclSIMDViewExpert.rc | 32 + .../1.100/packages/d6/JclSIMDViewExpert.res | Bin 0 -> 924 bytes .../packages/d6/JclSIMDViewExpertDLL.RES | Bin 0 -> 936 bytes .../packages/d6/JclSIMDViewExpertDLL.dof | 8 + .../packages/d6/JclSIMDViewExpertDLL.dpr | 49 + .../1.100/packages/d6/JclSIMDViewExpertDLL.rc | 32 + .../1.100/packages/d6/JclThreadNameExpert.dof | 4 + .../1.100/packages/d6/JclThreadNameExpert.dpk | 51 + .../1.100/packages/d6/JclThreadNameExpert.rc | 32 + .../1.100/packages/d6/JclThreadNameExpert.res | Bin 0 -> 920 bytes .../packages/d6/JclThreadNameExpertDLL.RES | Bin 0 -> 932 bytes .../packages/d6/JclThreadNameExpertDLL.dof | 8 + .../packages/d6/JclThreadNameExpertDLL.dpr | 46 + .../packages/d6/JclThreadNameExpertDLL.rc | 32 + official/1.100/packages/d6/JclUsesExpert.dof | 4 + official/1.100/packages/d6/JclUsesExpert.dpk | 53 + official/1.100/packages/d6/JclUsesExpert.rc | 32 + official/1.100/packages/d6/JclUsesExpert.res | Bin 0 -> 872 bytes .../1.100/packages/d6/JclUsesExpertDLL.RES | Bin 0 -> 884 bytes .../1.100/packages/d6/JclUsesExpertDLL.dof | 8 + .../1.100/packages/d6/JclUsesExpertDLL.dpr | 48 + .../1.100/packages/d6/JclUsesExpertDLL.rc | 32 + official/1.100/packages/d6/JclVClx.dof | 4 + official/1.100/packages/d6/JclVClx.dpk | 49 + official/1.100/packages/d6/JclVClx.rc | 32 + official/1.100/packages/d6/JclVClx.res | Bin 0 -> 888 bytes official/1.100/packages/d6/JclVcl.dof | 4 + official/1.100/packages/d6/JclVcl.dpk | 51 + official/1.100/packages/d6/JclVcl.rc | 32 + official/1.100/packages/d6/JclVcl.res | Bin 0 -> 872 bytes .../packages/d6/JclVersionControlExpert.dof | 4 + .../packages/d6/JclVersionControlExpert.dpk | 53 + .../packages/d6/JclVersionControlExpert.rc | 32 + .../packages/d6/JclVersionControlExpert.res | Bin 0 -> 988 bytes .../d6/JclVersionControlExpertDLL.dof | 8 + .../d6/JclVersionControlExpertDLL.dpr | 48 + .../packages/d6/JclVersionControlExpertDLL.rc | 32 + .../d6/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/d6/dirinfo.txt | 1 + official/1.100/packages/d6/template.dof | 10 + official/1.100/packages/d6/template.dpk | 56 + official/1.100/packages/d6/template.dpr | 58 + official/1.100/packages/d6/template.rc | 32 + official/1.100/packages/d7/Jcl.dof | 4 + official/1.100/packages/d7/Jcl.dpk | 135 + official/1.100/packages/d7/Jcl.rc | 32 + official/1.100/packages/d7/Jcl.res | Bin 0 -> 856 bytes official/1.100/packages/d7/JclBaseExpert.dof | 4 + official/1.100/packages/d7/JclBaseExpert.dpk | 56 + official/1.100/packages/d7/JclBaseExpert.rc | 32 + official/1.100/packages/d7/JclBaseExpert.res | Bin 0 -> 940 bytes official/1.100/packages/d7/JclDebugExpert.dof | 4 + official/1.100/packages/d7/JclDebugExpert.dpk | 52 + official/1.100/packages/d7/JclDebugExpert.rc | 32 + official/1.100/packages/d7/JclDebugExpert.res | Bin 0 -> 892 bytes .../1.100/packages/d7/JclDebugExpertDLL.RES | Bin 0 -> 900 bytes .../1.100/packages/d7/JclDebugExpertDLL.dof | 8 + .../1.100/packages/d7/JclDebugExpertDLL.dpr | 47 + .../1.100/packages/d7/JclDebugExpertDLL.rc | 32 + .../packages/d7/JclFavoriteFoldersExpert.dof | 4 + .../packages/d7/JclFavoriteFoldersExpert.dpk | 51 + .../packages/d7/JclFavoriteFoldersExpert.rc | 32 + .../packages/d7/JclFavoriteFoldersExpert.res | Bin 0 -> 988 bytes .../d7/JclFavoriteFoldersExpertDLL.RES | Bin 0 -> 996 bytes .../d7/JclFavoriteFoldersExpertDLL.dof | 8 + .../d7/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d7/JclFavoriteFoldersExpertDLL.rc | 32 + .../packages/d7/JclProjectAnalysisExpert.RES | Bin 0 -> 928 bytes .../packages/d7/JclProjectAnalysisExpert.dof | 4 + .../packages/d7/JclProjectAnalysisExpert.dpk | 51 + .../packages/d7/JclProjectAnalysisExpert.rc | 32 + .../d7/JclProjectAnalysisExpertDLL.RES | Bin 0 -> 936 bytes .../d7/JclProjectAnalysisExpertDLL.dof | 8 + .../d7/JclProjectAnalysisExpertDLL.dpr | 46 + .../d7/JclProjectAnalysisExpertDLL.rc | 32 + .../1.100/packages/d7/JclRepositoryExpert.dof | 4 + .../1.100/packages/d7/JclRepositoryExpert.dpk | 59 + .../1.100/packages/d7/JclRepositoryExpert.rc | 32 + .../1.100/packages/d7/JclRepositoryExpert.res | Bin 0 -> 944 bytes .../packages/d7/JclRepositoryExpertDLL.dof | 8 + .../packages/d7/JclRepositoryExpertDLL.dpr | 54 + .../packages/d7/JclRepositoryExpertDLL.rc | 32 + .../packages/d7/JclRepositoryExpertDLL.res | Bin 0 -> 960 bytes .../1.100/packages/d7/JclSIMDViewExpert.dof | 4 + .../1.100/packages/d7/JclSIMDViewExpert.dpk | 54 + .../1.100/packages/d7/JclSIMDViewExpert.rc | 32 + .../1.100/packages/d7/JclSIMDViewExpert.res | Bin 0 -> 920 bytes .../packages/d7/JclSIMDViewExpertDLL.RES | Bin 0 -> 936 bytes .../packages/d7/JclSIMDViewExpertDLL.dof | 8 + .../packages/d7/JclSIMDViewExpertDLL.dpr | 49 + .../1.100/packages/d7/JclSIMDViewExpertDLL.rc | 32 + .../1.100/packages/d7/JclThreadNameExpert.dof | 4 + .../1.100/packages/d7/JclThreadNameExpert.dpk | 51 + .../1.100/packages/d7/JclThreadNameExpert.rc | 32 + .../1.100/packages/d7/JclThreadNameExpert.res | Bin 0 -> 916 bytes .../packages/d7/JclThreadNameExpertDLL.RES | Bin 0 -> 932 bytes .../packages/d7/JclThreadNameExpertDLL.dof | 8 + .../packages/d7/JclThreadNameExpertDLL.dpr | 46 + .../packages/d7/JclThreadNameExpertDLL.rc | 32 + official/1.100/packages/d7/JclUsesExpert.dof | 4 + official/1.100/packages/d7/JclUsesExpert.dpk | 53 + official/1.100/packages/d7/JclUsesExpert.rc | 32 + official/1.100/packages/d7/JclUsesExpert.res | Bin 0 -> 868 bytes .../1.100/packages/d7/JclUsesExpertDLL.RES | Bin 0 -> 884 bytes .../1.100/packages/d7/JclUsesExpertDLL.dof | 8 + .../1.100/packages/d7/JclUsesExpertDLL.dpr | 48 + .../1.100/packages/d7/JclUsesExpertDLL.rc | 32 + official/1.100/packages/d7/JclVClx.dof | 4 + official/1.100/packages/d7/JclVClx.dpk | 49 + official/1.100/packages/d7/JclVClx.rc | 32 + official/1.100/packages/d7/JclVClx.res | Bin 0 -> 884 bytes official/1.100/packages/d7/JclVcl.dof | 4 + official/1.100/packages/d7/JclVcl.dpk | 51 + official/1.100/packages/d7/JclVcl.rc | 32 + official/1.100/packages/d7/JclVcl.res | Bin 0 -> 872 bytes .../packages/d7/JclVersionControlExpert.dof | 4 + .../packages/d7/JclVersionControlExpert.dpk | 53 + .../packages/d7/JclVersionControlExpert.rc | 32 + .../packages/d7/JclVersionControlExpert.res | Bin 0 -> 984 bytes .../d7/JclVersionControlExpertDLL.dof | 8 + .../d7/JclVersionControlExpertDLL.dpr | 48 + .../packages/d7/JclVersionControlExpertDLL.rc | 32 + .../d7/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/d7/dirinfo.txt | 1 + official/1.100/packages/d7/template.dof | 10 + official/1.100/packages/d7/template.dpk | 56 + official/1.100/packages/d7/template.dpr | 58 + official/1.100/packages/d7/template.rc | 32 + official/1.100/packages/d8/Jcl.RES | Bin 0 -> 856 bytes official/1.100/packages/d8/Jcl.bdsproj | 174 + official/1.100/packages/d8/Jcl.dpk | 135 + official/1.100/packages/d8/Jcl.rc | 32 + official/1.100/packages/d8/JclBaseExpert.RES | Bin 0 -> 940 bytes .../1.100/packages/d8/JclBaseExpert.bdsproj | 174 + official/1.100/packages/d8/JclBaseExpert.dpk | 56 + official/1.100/packages/d8/JclBaseExpert.rc | 32 + .../d8/JclFavoriteFoldersExpertDLL.RES | Bin 0 -> 996 bytes .../d8/JclFavoriteFoldersExpertDLL.bdsproj | 174 + .../d8/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d8/JclFavoriteFoldersExpertDLL.rc | 32 + .../d8/JclVersionControlExpertDLL.bdsproj | 174 + .../d8/JclVersionControlExpertDLL.dpr | 48 + .../packages/d8/JclVersionControlExpertDLL.rc | 32 + .../d8/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/d8/template.bdsproj | 174 + official/1.100/packages/d8/template.dpk | 56 + official/1.100/packages/d8/template.dpr | 60 + official/1.100/packages/d8/template.rc | 32 + .../1.100/packages/d9.net/Jedi.Jcl.bdsproj | 213 + official/1.100/packages/d9.net/Jedi.Jcl.dpr | 64 + .../1.100/packages/d9.net/template.bdsproj | 188 + official/1.100/packages/d9.net/template.dpr | 39 + official/1.100/packages/d9/Jcl.RES | Bin 0 -> 856 bytes official/1.100/packages/d9/Jcl.bdsproj | 174 + official/1.100/packages/d9/Jcl.dpk | 135 + official/1.100/packages/d9/Jcl.rc | 32 + .../1.100/packages/d9/JclBaseExpert.bdsproj | 174 + official/1.100/packages/d9/JclBaseExpert.dpk | 56 + official/1.100/packages/d9/JclBaseExpert.rc | 32 + official/1.100/packages/d9/JclBaseExpert.res | Bin 0 -> 940 bytes official/1.100/packages/d9/JclDebugExpert.RES | Bin 0 -> 892 bytes .../1.100/packages/d9/JclDebugExpert.bdsproj | 174 + official/1.100/packages/d9/JclDebugExpert.dpk | 52 + official/1.100/packages/d9/JclDebugExpert.rc | 32 + .../1.100/packages/d9/JclDebugExpertDLL.RES | Bin 0 -> 900 bytes .../packages/d9/JclDebugExpertDLL.bdsproj | 174 + .../1.100/packages/d9/JclDebugExpertDLL.dpr | 47 + .../1.100/packages/d9/JclDebugExpertDLL.rc | 32 + .../1.100/packages/d9/JclExperts.bdsgroup | 22 + .../d9/JclFavoriteFoldersExpert.bdsproj | 174 + .../packages/d9/JclFavoriteFoldersExpert.dpk | 51 + .../packages/d9/JclFavoriteFoldersExpert.rc | 32 + .../packages/d9/JclFavoriteFoldersExpert.res | Bin 0 -> 988 bytes .../d9/JclFavoriteFoldersExpertDLL.RES | Bin 0 -> 996 bytes .../d9/JclFavoriteFoldersExpertDLL.bdsproj | 174 + .../d9/JclFavoriteFoldersExpertDLL.dpr | 46 + .../d9/JclFavoriteFoldersExpertDLL.rc | 32 + .../packages/d9/JclProjectAnalysisExpert.RES | Bin 0 -> 928 bytes .../d9/JclProjectAnalysisExpert.bdsproj | 174 + .../packages/d9/JclProjectAnalysisExpert.dpk | 51 + .../packages/d9/JclProjectAnalysisExpert.rc | 32 + .../d9/JclProjectAnalysisExpertDLL.RES | Bin 0 -> 936 bytes .../d9/JclProjectAnalysisExpertDLL.bdsproj | 174 + .../d9/JclProjectAnalysisExpertDLL.dpr | 46 + .../d9/JclProjectAnalysisExpertDLL.rc | 32 + .../packages/d9/JclRepositoryExpert.bdsproj | 174 + .../1.100/packages/d9/JclRepositoryExpert.dpk | 59 + .../1.100/packages/d9/JclRepositoryExpert.rc | 32 + .../1.100/packages/d9/JclRepositoryExpert.res | Bin 0 -> 944 bytes .../d9/JclRepositoryExpertDLL.bdsproj | 174 + .../packages/d9/JclRepositoryExpertDLL.dpr | 54 + .../packages/d9/JclRepositoryExpertDLL.rc | 32 + .../packages/d9/JclRepositoryExpertDLL.res | Bin 0 -> 960 bytes .../packages/d9/JclSIMDViewExpert.bdsproj | 174 + .../1.100/packages/d9/JclSIMDViewExpert.dpk | 54 + .../1.100/packages/d9/JclSIMDViewExpert.rc | 32 + .../packages/d9/JclSIMDViewExpertDLL.RES | Bin 0 -> 936 bytes .../packages/d9/JclSIMDViewExpertDLL.bdsproj | 174 + .../packages/d9/JclSIMDViewExpertDLL.dpr | 49 + .../1.100/packages/d9/JclSIMDViewExpertDLL.rc | 32 + .../1.100/packages/d9/JclSimdViewExpert.RES | Bin 0 -> 920 bytes .../1.100/packages/d9/JclThreadNameExpert.RES | Bin 0 -> 916 bytes .../packages/d9/JclThreadNameExpert.bdsproj | 174 + .../1.100/packages/d9/JclThreadNameExpert.dpk | 51 + .../1.100/packages/d9/JclThreadNameExpert.rc | 32 + .../packages/d9/JclThreadNameExpertDLL.RES | Bin 0 -> 932 bytes .../d9/JclThreadNameExpertDLL.bdsproj | 174 + .../packages/d9/JclThreadNameExpertDLL.dpr | 46 + .../packages/d9/JclThreadNameExpertDLL.rc | 32 + official/1.100/packages/d9/JclVcl.RES | Bin 0 -> 872 bytes official/1.100/packages/d9/JclVcl.bdsproj | 174 + official/1.100/packages/d9/JclVcl.dpk | 51 + official/1.100/packages/d9/JclVcl.rc | 32 + .../d9/JclVersionControlExpert.bdsproj | 174 + .../packages/d9/JclVersionControlExpert.dpk | 53 + .../packages/d9/JclVersionControlExpert.rc | 32 + .../packages/d9/JclVersionControlExpert.res | Bin 0 -> 984 bytes .../d9/JclVersionControlExpertDLL.bdsproj | 174 + .../d9/JclVersionControlExpertDLL.dpr | 48 + .../packages/d9/JclVersionControlExpertDLL.rc | 32 + .../d9/JclVersionControlExpertDLL.res | Bin 0 -> 1000 bytes official/1.100/packages/d9/template.bdsproj | 174 + official/1.100/packages/d9/template.dpk | 56 + official/1.100/packages/d9/template.dpr | 58 + official/1.100/packages/d9/template.rc | 32 + official/1.100/packages/dirinfo.txt | 12 + official/1.100/packages/k3/Jcl.bpf | 5 + official/1.100/packages/k3/Jcl.bpk | 186 + official/1.100/packages/k3/Jcl.dpk | 99 + official/1.100/packages/k3/Jcl.kof | 3 + official/1.100/packages/k3/Jcl.rc | 32 + official/1.100/packages/k3/Jcl.res | Bin 0 -> 876 bytes official/1.100/packages/k3/JclVClx.bpf | 5 + official/1.100/packages/k3/JclVClx.bpk | 90 + official/1.100/packages/k3/JclVClx.dpk | 50 + official/1.100/packages/k3/JclVClx.kof | 3 + official/1.100/packages/k3/JclVClx.rc | 32 + official/1.100/packages/k3/JclVClx.res | Bin 0 -> 904 bytes official/1.100/packages/k3/dirinfo.txt | 1 + official/1.100/packages/k3/template.bpf | 5 + official/1.100/packages/k3/template.bpk | 98 + official/1.100/packages/k3/template.dpk | 51 + official/1.100/packages/k3/template.kof | 3 + official/1.100/packages/k3/template.rc | 32 + official/1.100/packages/resources.mak | 180 + official/1.100/packages/xml/Jcl-L.xml | 49 + official/1.100/packages/xml/Jcl-R.xml | 114 + .../1.100/packages/xml/JclBaseExpert-D.xml | 33 + .../1.100/packages/xml/JclDebugExpert-D.xml | 29 + .../packages/xml/JclDebugExpertDLL-L.xml | 29 + .../xml/JclFavoriteFoldersExpert-D.xml | 28 + .../xml/JclFavoriteFoldersExpertDLL-L.xml | 28 + .../xml/JclProjectAnalysisExpert-D.xml | 28 + .../xml/JclProjectAnalysisExpertDLL-L.xml | 28 + .../packages/xml/JclRepositoryExpert-D.xml | 36 + .../packages/xml/JclRepositoryExpertDLL-L.xml | 36 + .../packages/xml/JclSIMDViewExpert-D.xml | 31 + .../packages/xml/JclSIMDViewExpertDLL-L.xml | 31 + .../packages/xml/JclThreadNameExpert-D.xml | 28 + .../packages/xml/JclThreadNameExpertDLL-L.xml | 28 + .../1.100/packages/xml/JclUsesExpert-D.xml | 30 + .../1.100/packages/xml/JclUsesExpertDLL-L.xml | 30 + official/1.100/packages/xml/JclVClx-R.xml | 25 + official/1.100/packages/xml/JclVcl-R.xml | 29 + .../xml/JclVersionControlExpert-D.xml | 30 + .../xml/JclVersionControlExpertDLL-L.xml | 30 + official/1.100/source/Makefile.fpc | 13 + official/1.100/source/common/Jcl8087.pas | 248 + .../source/common/JclAbstractContainers.pas | 253 + .../1.100/source/common/JclAlgorithms.pas | 601 + .../1.100/source/common/JclAnsiStrings.pas | 3989 ++ .../1.100/source/common/JclArrayLists.pas | 2044 + official/1.100/source/common/JclArraySets.pas | 418 + official/1.100/source/common/JclBase.pas | 571 + .../1.100/source/common/JclBinaryTrees.pas | 3301 ++ .../1.100/source/common/JclBorlandTools.pas | 5475 +++ official/1.100/source/common/JclComplex.pas | 1588 + .../1.100/source/common/JclCompression.pas | 1654 + .../1.100/source/common/JclContainerIntf.pas | 480 + official/1.100/source/common/JclCounter.pas | 229 + official/1.100/source/common/JclDITs-1.92.int | 114 + official/1.100/source/common/JclDateTime.pas | 1216 + official/1.100/source/common/JclEDI.pas | 1668 + official/1.100/source/common/JclEDISEF.pas | 4706 +++ .../1.100/source/common/JclEDITranslators.pas | 426 + official/1.100/source/common/JclEDIXML.pas | 2703 ++ .../1.100/source/common/JclEDI_ANSIX12.pas | 3287 ++ .../source/common/JclEDI_ANSIX12_Ext.pas | 289 + .../1.100/source/common/JclEDI_UNEDIFACT.pas | 2342 ++ .../source/common/JclEDI_UNEDIFACT_Ext.pas | 294 + official/1.100/source/common/JclExprEval.pas | 4014 ++ official/1.100/source/common/JclFileUtils.pas | 6224 +++ official/1.100/source/common/JclHashMaps.pas | 2156 ++ official/1.100/source/common/JclHashSets.pas | 632 + .../1.100/source/common/JclIniFiles-1.92.int | 55 + official/1.100/source/common/JclIniFiles.pas | 195 + .../1.100/source/common/JclLinkedLists.pas | 2566 ++ official/1.100/source/common/JclLogic.pas | 1950 + official/1.100/source/common/JclMIDI.pas | 816 + official/1.100/source/common/JclMath.pas | 4467 +++ official/1.100/source/common/JclMime.pas | 987 + official/1.100/source/common/JclPCRE.pas | 658 + official/1.100/source/common/JclQueues.pas | 364 + official/1.100/source/common/JclRTTI.pas | 3075 ++ official/1.100/source/common/JclResources.pas | 1869 + official/1.100/source/common/JclSchedule.pas | 1593 + official/1.100/source/common/JclSimpleXml.pas | 3628 ++ official/1.100/source/common/JclStacks.pas | 367 + .../1.100/source/common/JclStatistics.pas | 523 + .../1.100/source/common/JclStrHashMap.pas | 889 + official/1.100/source/common/JclStreams.pas | 1403 + .../1.100/source/common/JclStringLists.pas | 1379 + official/1.100/source/common/JclStrings.pas | 5035 +++ official/1.100/source/common/JclSysInfo.fpc | 95 + official/1.100/source/common/JclSysInfo.pas | 5318 +++ official/1.100/source/common/JclSysUtils.pas | 3187 ++ official/1.100/source/common/JclUnitConv.pas | 1025 + .../1.100/source/common/JclUnitVersioning.pas | 791 + .../common/JclUnitVersioningProviders.pas | 402 + .../1.100/source/common/JclValidation.pas | 152 + official/1.100/source/common/JclVectors.pas | 1505 + .../1.100/source/common/JclWideStrings.pas | 2041 + official/1.100/source/common/JclZLib.int | 349 + official/1.100/source/common/bzip2.pas | 467 + official/1.100/source/common/dirinfo.txt | 1 + official/1.100/source/common/pcre.pas | 1208 + official/1.100/source/crossplatform.inc | 31 + official/1.100/source/fpctest.bat | 14 + official/1.100/source/fpctestunit.bat | 15 + official/1.100/source/jcl.inc | 242 + official/1.100/source/jcl.template.inc | 94 + official/1.100/source/jclc5.inc | 94 + official/1.100/source/jclc6.inc | 94 + official/1.100/source/jclcs1.inc | 94 + official/1.100/source/jcld10.inc | 94 + official/1.100/source/jcld10.net.inc | 94 + official/1.100/source/jcld11.inc | 94 + official/1.100/source/jcld5.inc | 94 + official/1.100/source/jcld6.inc | 94 + official/1.100/source/jcld7.inc | 94 + official/1.100/source/jcld8.inc | 94 + official/1.100/source/jcld9.inc | 94 + official/1.100/source/jcld9.net.inc | 94 + official/1.100/source/jclkc3.inc | 94 + official/1.100/source/jclkd3.inc | 94 + official/1.100/source/jedi.inc | 980 + official/1.100/source/kylix.inc | 30 + .../1.100/source/prototypes/Hardlinks.pas | 889 + .../1.100/source/prototypes/JclGraphUtils.pas | 3 + .../1.100/source/prototypes/JclGraphics.pas | 4 + .../source/prototypes/JclQGraphUtils.pas | 4 + .../1.100/source/prototypes/JclQGraphics.pas | 4 + official/1.100/source/prototypes/JclWin32.pas | 287 + official/1.100/source/prototypes/Makefile.mak | 76 + .../1.100/source/prototypes/_GraphUtils.pas | 2654 ++ .../1.100/source/prototypes/_Graphics.pas | 5728 +++ .../supplement/create_JCL_Hardlinks.pas.cmd | 13 + .../create_nonJCL_Hardlinks.pas.cmd | 4 + .../source/prototypes/supplement/simple_pp.pl | 60 + .../source/prototypes/win32api/AclApi.imp | 21 + .../source/prototypes/win32api/AclApi.int | 12 + .../source/prototypes/win32api/BaseTsd.int | 7 + .../source/prototypes/win32api/DelayImp.int | 51 + .../source/prototypes/win32api/ImageHlp.imp | 219 + .../source/prototypes/win32api/ImageHlp.int | 204 + .../source/prototypes/win32api/ImgGuids.int | 9 + .../source/prototypes/win32api/LmAccess.imp | 408 + .../source/prototypes/win32api/LmAccess.int | 466 + .../source/prototypes/win32api/LmApiBuf.imp | 20 + .../source/prototypes/win32api/LmApiBuf.int | 8 + .../source/prototypes/win32api/LmCons.int | 284 + .../source/prototypes/win32api/LmErr.int | 891 + .../source/prototypes/win32api/MsiDefs.int | 12 + .../source/prototypes/win32api/NTDef.int | 27 + .../1.100/source/prototypes/win32api/Nb30.imp | 20 + .../1.100/source/prototypes/win32api/Nb30.int | 430 + .../source/prototypes/win32api/ObjBase.imp | 36 + .../source/prototypes/win32api/ObjBase.int | 42 + .../source/prototypes/win32api/PropIdl.int | 135 + .../source/prototypes/win32api/RasDlg.int | 18 + .../source/prototypes/win32api/Reason.int | 125 + .../source/prototypes/win32api/ShlGuid.int | 192 + .../source/prototypes/win32api/ShlObj.int | 44 + .../source/prototypes/win32api/ShlWApi.int | 22 + .../source/prototypes/win32api/WinBase.imp | 170 + .../source/prototypes/win32api/WinBase.int | 146 + .../source/prototypes/win32api/WinDef.int | 9 + .../source/prototypes/win32api/WinError.int | 228 + .../source/prototypes/win32api/WinIoctl.int | 601 + .../source/prototypes/win32api/WinNLS.imp | 46 + .../source/prototypes/win32api/WinNLS.int | 141 + .../source/prototypes/win32api/WinNT.imp | 108 + .../source/prototypes/win32api/WinNT.int | 2786 ++ .../source/prototypes/win32api/WinUser.int | 88 + .../source/prototypes/win32api/dirinfo.txt | 12 + .../1.100/source/prototypes/win32api/fpc.inc | 71 + .../source/prototypes/win32api/powrprof.imp | 58 + .../source/prototypes/win32api/powrprof.int | 8 + official/1.100/source/prototypes/zlibh.pas | 1728 + official/1.100/source/unix/dirinfo.txt | 1 + official/1.100/source/unix/zlibh.pas | 1581 + official/1.100/source/unixonly.inc | 51 + official/1.100/source/vcl/JclGraphUtils.pas | 2604 ++ official/1.100/source/vcl/JclGraphics.pas | 5645 +++ official/1.100/source/vcl/JclPrint.pas | 1194 + official/1.100/source/vcl/dirinfo.txt | 1 + .../1.100/source/visclx/JclQGraphUtils.pas | 2527 ++ official/1.100/source/visclx/JclQGraphics.pas | 1504 + official/1.100/source/visclx/dirinfo.txt | 1 + official/1.100/source/windows/Hardlinks.pas | 679 + official/1.100/source/windows/JclAppInst.pas | 594 + official/1.100/source/windows/JclCIL.pas | 1027 + official/1.100/source/windows/JclCLR.pas | 1776 + official/1.100/source/windows/JclCOM.pas | 672 + .../source/windows/JclCommCtrlAdmin.manifest | 28 + .../1.100/source/windows/JclCommCtrlAdmin.rc | 7 + .../1.100/source/windows/JclCommCtrlAdmin.res | Bin 0 -> 920 bytes .../windows/JclCommCtrlAsInvoker.manifest | 28 + .../source/windows/JclCommCtrlAsInvoker.rc | 7 + .../source/windows/JclCommCtrlAsInvoker.res | Bin 0 -> 908 bytes official/1.100/source/windows/JclConsole.pas | 1568 + official/1.100/source/windows/JclDebug.pas | 5084 +++ official/1.100/source/windows/JclDotNet.pas | 1260 + .../1.100/source/windows/JclHookExcept.pas | 633 + official/1.100/source/windows/JclLANMan.pas | 455 + official/1.100/source/windows/JclLocales.pas | 1057 + official/1.100/source/windows/JclMapi.pas | 1354 + official/1.100/source/windows/JclMetadata.pas | 4834 +++ official/1.100/source/windows/JclMiscel.pas | 514 + official/1.100/source/windows/JclMsdosSys.pas | 649 + .../1.100/source/windows/JclMultimedia.pas | 1365 + official/1.100/source/windows/JclNTFS.pas | 2307 ++ .../source/windows/JclNoDepAdmin.manifest | 17 + .../1.100/source/windows/JclNoDepAdmin.rc | 7 + .../1.100/source/windows/JclNoDepAdmin.res | Bin 0 -> 608 bytes .../source/windows/JclNoDepAsInvoker.manifest | 17 + .../1.100/source/windows/JclNoDepAsInvoker.rc | 7 + .../source/windows/JclNoDepAsInvoker.res | Bin 0 -> 596 bytes official/1.100/source/windows/JclPeImage.pas | 6461 +++ official/1.100/source/windows/JclRegistry.pas | 1722 + official/1.100/source/windows/JclSecurity.pas | 439 + official/1.100/source/windows/JclShell.pas | 1527 + .../1.100/source/windows/JclStructStorage.pas | 788 + official/1.100/source/windows/JclSvcCtrl.pas | 1459 + official/1.100/source/windows/JclSynch.pas | 1402 + official/1.100/source/windows/JclTD32.pas | 1700 + official/1.100/source/windows/JclTask.pas | 922 + official/1.100/source/windows/JclUnicode.pas | 8571 ++++ official/1.100/source/windows/JclUnicode.rc | 3519 ++ official/1.100/source/windows/JclUnicode.res | Bin 0 -> 113680 bytes .../1.100/source/windows/JclWideFormat.pas | 901 + official/1.100/source/windows/JclWin32.pas | 8308 ++++ official/1.100/source/windows/JclWin32Ex.pas | 397 + official/1.100/source/windows/JclWinMIDI.pas | 296 + .../source/windows/MSHelpServices_TLB.pas | 1621 + official/1.100/source/windows/MSTask.pas | 648 + official/1.100/source/windows/Snmp.pas | 898 + official/1.100/source/windows/dirinfo.txt | 1 + official/1.100/source/windows/mscoree_TLB.pas | 439 + .../1.100/source/windows/mscorlib_TLB.pas | 32325 ++++++++++++++++ .../source/windows/obj/bzip2/blocksort.obj | Bin 0 -> 12448 bytes .../1.100/source/windows/obj/bzip2/bzlib.obj | Bin 0 -> 12370 bytes .../source/windows/obj/bzip2/compress.obj | Bin 0 -> 14762 bytes .../source/windows/obj/bzip2/crctable.obj | Bin 0 -> 6446 bytes .../source/windows/obj/bzip2/decompress.obj | Bin 0 -> 16512 bytes .../source/windows/obj/bzip2/dirinfo.txt | 1 + .../source/windows/obj/bzip2/huffman.obj | Bin 0 -> 6912 bytes .../source/windows/obj/bzip2/makefile.mak | 106 + .../source/windows/obj/bzip2/randtable.obj | Bin 0 -> 7475 bytes official/1.100/source/windows/obj/dirinfo.txt | 1 + .../1.100/source/windows/obj/pcre/dirinfo.txt | 1 + .../source/windows/obj/pcre/makefile.mak | 127 + .../source/windows/obj/pcre/pcre_compile.obj | Bin 0 -> 24647 bytes .../source/windows/obj/pcre/pcre_config.obj | Bin 0 -> 1797 bytes .../windows/obj/pcre/pcre_default_tables.obj | Bin 0 -> 2724 bytes .../source/windows/obj/pcre/pcre_dfa_exec.obj | Bin 0 -> 19364 bytes .../source/windows/obj/pcre/pcre_exec.obj | Bin 0 -> 15369 bytes .../source/windows/obj/pcre/pcre_fullinfo.obj | Bin 0 -> 2149 bytes .../source/windows/obj/pcre/pcre_get.obj | Bin 0 -> 3346 bytes .../source/windows/obj/pcre/pcre_globals.obj | Bin 0 -> 1618 bytes .../source/windows/obj/pcre/pcre_info.obj | Bin 0 -> 1781 bytes .../windows/obj/pcre/pcre_maketables.obj | Bin 0 -> 2628 bytes .../source/windows/obj/pcre/pcre_newline.obj | Bin 0 -> 1977 bytes .../source/windows/obj/pcre/pcre_ord2utf8.obj | Bin 0 -> 1813 bytes .../source/windows/obj/pcre/pcre_refcount.obj | Bin 0 -> 1716 bytes .../source/windows/obj/pcre/pcre_study.obj | Bin 0 -> 3829 bytes .../source/windows/obj/pcre/pcre_tables.obj | Bin 0 -> 4010 bytes .../windows/obj/pcre/pcre_try_flipped.obj | Bin 0 -> 2023 bytes .../windows/obj/pcre/pcre_ucp_searchfuncs.obj | Bin 0 -> 26947 bytes .../windows/obj/pcre/pcre_valid_utf8.obj | Bin 0 -> 2042 bytes .../source/windows/obj/pcre/pcre_version.obj | Bin 0 -> 1729 bytes .../source/windows/obj/pcre/pcre_xclass.obj | Bin 0 -> 1809 bytes .../1.100/source/windows/obj/zlib/adler32.obj | Bin 0 -> 1132 bytes .../source/windows/obj/zlib/compress.obj | Bin 0 -> 658 bytes .../1.100/source/windows/obj/zlib/crc32.obj | Bin 0 -> 12172 bytes .../1.100/source/windows/obj/zlib/deflate.obj | Bin 0 -> 10101 bytes .../1.100/source/windows/obj/zlib/dirinfo.txt | 1 + .../1.100/source/windows/obj/zlib/gzio.obj | Bin 0 -> 6330 bytes .../1.100/source/windows/obj/zlib/infback.obj | Bin 0 -> 8101 bytes .../1.100/source/windows/obj/zlib/inffast.obj | Bin 0 -> 2664 bytes .../1.100/source/windows/obj/zlib/inflate.obj | Bin 0 -> 11884 bytes .../source/windows/obj/zlib/inftrees.obj | Bin 0 -> 2700 bytes .../source/windows/obj/zlib/makefile.mak | 109 + .../1.100/source/windows/obj/zlib/trees.obj | Bin 0 -> 12141 bytes .../1.100/source/windows/obj/zlib/uncompr.obj | Bin 0 -> 596 bytes .../1.100/source/windows/obj/zlib/zutil.obj | Bin 0 -> 1673 bytes official/1.100/source/windows/zlibh.pas | 1639 + official/1.100/source/windowsonly.inc | 52 + 1738 files changed, 374965 insertions(+) create mode 100644 official/1.100/Install.bat create mode 100644 official/1.100/Install.txt create mode 100644 official/1.100/InstallForDelphi.bat create mode 100644 official/1.100/QInstall.bat create mode 100644 official/1.100/bin/dirinfo.txt create mode 100644 official/1.100/clean.bat create mode 100644 official/1.100/clean.sh create mode 100644 official/1.100/devtools/included_files.bat create mode 100644 official/1.100/devtools/included_files.sh create mode 100644 official/1.100/devtools/jpp create mode 100644 official/1.100/devtools/jpp.exe create mode 100644 official/1.100/devtools/pgEdit.exe create mode 100644 official/1.100/devtools/pgEdit.xml create mode 100644 official/1.100/docs/Contacting authors.html create mode 100644 official/1.100/docs/Contributors.html create mode 100644 official/1.100/docs/Contributors.txt create mode 100644 official/1.100/docs/Experts.html create mode 100644 official/1.100/docs/MPL FAQ.html create mode 100644 official/1.100/docs/MPL-1.1.txt create mode 100644 official/1.100/docs/Readme.html create mode 100644 official/1.100/docs/Readme.txt create mode 100644 official/1.100/docs/ThreadSafe.txt create mode 100644 official/1.100/docs/cps.html create mode 100644 official/1.100/docs/cps_files/strucv1.jpg create mode 100644 official/1.100/docs/cps_files/test.css create mode 100644 official/1.100/docs/styles/default.css create mode 100644 official/1.100/examples/C10.exc create mode 100644 official/1.100/examples/C5.exc create mode 100644 official/1.100/examples/C6.exc create mode 100644 official/1.100/examples/D10.exc create mode 100644 official/1.100/examples/D11.exc create mode 100644 official/1.100/examples/D5.exc create mode 100644 official/1.100/examples/D6.exc create mode 100644 official/1.100/examples/D7.exc create mode 100644 official/1.100/examples/D9.exc create mode 100644 official/1.100/examples/JclDebugExamples.bdsgroup create mode 100644 official/1.100/examples/JclDebugExamples.bpg create mode 100644 official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dof create mode 100644 official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dpr create mode 100644 official/1.100/examples/common/containers/algorithms/AlgorithmsExample.res create mode 100644 official/1.100/examples/common/containers/algorithms/AlgorithmsExampleMain.dfm create mode 100644 official/1.100/examples/common/containers/algorithms/AlgorithmsExampleMain.pas create mode 100644 official/1.100/examples/common/containers/hashing/HashingExample.dof create mode 100644 official/1.100/examples/common/containers/hashing/HashingExample.dpr create mode 100644 official/1.100/examples/common/containers/hashing/HashingExample.res create mode 100644 official/1.100/examples/common/containers/hashing/HashingExampleMain.dfm create mode 100644 official/1.100/examples/common/containers/hashing/HashingExampleMain.pas create mode 100644 official/1.100/examples/common/containers/lists/ListExample.dof create mode 100644 official/1.100/examples/common/containers/lists/ListExample.dpr create mode 100644 official/1.100/examples/common/containers/lists/ListExample.res create mode 100644 official/1.100/examples/common/containers/lists/ListExampleMain.dfm create mode 100644 official/1.100/examples/common/containers/lists/ListExampleMain.pas create mode 100644 official/1.100/examples/common/containers/lists/MyObjectList.pas create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformance.dof create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformance.dpr create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformance.res create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformanceMain.dfm create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformanceMain.pas create mode 100644 official/1.100/examples/common/containers/performance/ContainerPerformanceTests.pas create mode 100644 official/1.100/examples/common/containers/trees/TreeExample.dof create mode 100644 official/1.100/examples/common/containers/trees/TreeExample.dpr create mode 100644 official/1.100/examples/common/containers/trees/TreeExample.res create mode 100644 official/1.100/examples/common/containers/trees/TreeExampleMain.dfm create mode 100644 official/1.100/examples/common/containers/trees/TreeExampleMain.pas create mode 100644 official/1.100/examples/common/expreval/ExprEvalExample.dof create mode 100644 official/1.100/examples/common/expreval/ExprEvalExample.dpr create mode 100644 official/1.100/examples/common/expreval/ExprEvalExample.res create mode 100644 official/1.100/examples/common/expreval/ExprEvalExampleLogic.pas create mode 100644 official/1.100/examples/common/expreval/ExprEvalExampleMain.dfm create mode 100644 official/1.100/examples/common/expreval/ExprEvalExampleMain.pas create mode 100644 official/1.100/examples/common/expreval/QExprEvalExample.dof create mode 100644 official/1.100/examples/common/expreval/QExprEvalExample.dpr create mode 100644 official/1.100/examples/common/expreval/QExprEvalExample.res create mode 100644 official/1.100/examples/common/expreval/QExprEvalExampleMain.pas create mode 100644 official/1.100/examples/common/expreval/QExprEvalExampleMain.xfm create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemo.dof create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemo.dpr create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemo.res create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemoMain.dfm create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemoMain.pas create mode 100644 official/1.100/examples/common/filesearch/QFileSearchDemoMain.xfm create mode 100644 official/1.100/examples/common/graphics/QClipLineDemo.dof create mode 100644 official/1.100/examples/common/graphics/QClipLineDemo.dpr create mode 100644 official/1.100/examples/common/graphics/QClipLineDemo.res create mode 100644 official/1.100/examples/common/graphics/QClipLineDemoMain.dfm create mode 100644 official/1.100/examples/common/graphics/QClipLineDemoMain.pas create mode 100644 official/1.100/examples/common/graphics/QClipLineDemoMain.xfm create mode 100644 official/1.100/examples/common/graphics/StretchGraphicDemoMain.dfm create mode 100644 official/1.100/examples/common/graphics/StretchGraphicDemoMain.pas create mode 100644 official/1.100/examples/common/graphics/StretchGraphicExample.dof create mode 100644 official/1.100/examples/common/graphics/StretchGraphicExample.dpr create mode 100644 official/1.100/examples/common/graphics/StretchGraphicExample.res create mode 100644 official/1.100/examples/common/multimedia/MidiOutExample.dof create mode 100644 official/1.100/examples/common/multimedia/MidiOutExample.dpr create mode 100644 official/1.100/examples/common/multimedia/MidiOutExample.res create mode 100644 official/1.100/examples/common/multimedia/MidiOutExampleMain.dfm create mode 100644 official/1.100/examples/common/multimedia/MidiOutExampleMain.pas create mode 100644 official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.dfm create mode 100644 official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.pas create mode 100644 official/1.100/examples/common/numformat/QNumFormatExample.dof create mode 100644 official/1.100/examples/common/numformat/QNumFormatExample.dpr create mode 100644 official/1.100/examples/common/numformat/QNumFormatExample.res create mode 100644 official/1.100/examples/common/numformat/QNumFormatExampleMain.pas create mode 100644 official/1.100/examples/common/numformat/QNumFormatExampleMain.xfm create mode 100644 official/1.100/examples/common/pcre/PCREDemo.dof create mode 100644 official/1.100/examples/common/pcre/PCREDemo.dpr create mode 100644 official/1.100/examples/common/pcre/PCREDemo.res create mode 100644 official/1.100/examples/common/pcre/PCREDemoMain.dfm create mode 100644 official/1.100/examples/common/pcre/PCREDemoMain.pas create mode 100644 official/1.100/examples/common/pcre/QPCREDemo.dof create mode 100644 official/1.100/examples/common/pcre/QPCREDemo.dpr create mode 100644 official/1.100/examples/common/pcre/QPCREDemo.res create mode 100644 official/1.100/examples/common/pcre/QPCREDemoMain.pas create mode 100644 official/1.100/examples/common/pcre/QPCREDemoMain.xfm create mode 100644 official/1.100/examples/common/rtti/QRTTIDemo.dof create mode 100644 official/1.100/examples/common/rtti/QRTTIDemo.dpr create mode 100644 official/1.100/examples/common/rtti/QRTTIDemo.res create mode 100644 official/1.100/examples/common/rtti/QRTTIDemoMain.pas create mode 100644 official/1.100/examples/common/rtti/QRTTIDemoMain.xfm create mode 100644 official/1.100/examples/common/rtti/RTTIDemoMain.dfm create mode 100644 official/1.100/examples/common/rtti/RTTIDemoMain.pas create mode 100644 official/1.100/examples/common/rtti/RTTIExample.dof create mode 100644 official/1.100/examples/common/rtti/RTTIExample.dpr create mode 100644 official/1.100/examples/common/rtti/RTTIExample.res create mode 100644 official/1.100/examples/common/sysinfo/QEnvironmentExample.dof create mode 100644 official/1.100/examples/common/sysinfo/QEnvironmentExample.dpr create mode 100644 official/1.100/examples/common/sysinfo/QEnvironmentExample.res create mode 100644 official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.pas create mode 100644 official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.xfm create mode 100644 official/1.100/examples/common/textreader/TextReaderDemoMain.dfm create mode 100644 official/1.100/examples/common/textreader/TextReaderDemoMain.pas create mode 100644 official/1.100/examples/common/textreader/TextReaderExample.dof create mode 100644 official/1.100/examples/common/textreader/TextReaderExample.dpr create mode 100644 official/1.100/examples/common/textreader/TextReaderExample.res create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTest.dof create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTest.dpr create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTest.res create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTestDLL.dof create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTestDLL.dpr create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTestMain.dfm create mode 100644 official/1.100/examples/common/unitversioning/UnitVersioningTestMain.pas create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/AssemblyInfo.cs create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/JCLNet.FrmMain.resources create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/JCLNet.WinForm.resources create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/JCLNet.bdsproj create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/WinForm.cs create mode 100644 official/1.100/examples/dotnet/JCLNetDemo/WinForm.resx create mode 100644 official/1.100/examples/k3.exc create mode 100644 official/1.100/examples/visclx.exc create mode 100644 official/1.100/examples/windows/ConsoleExamples.dof create mode 100644 official/1.100/examples/windows/ConsoleExamples.dpr create mode 100644 official/1.100/examples/windows/appinst/AppInstDemoMain.dfm create mode 100644 official/1.100/examples/windows/appinst/AppInstDemoMain.pas create mode 100644 official/1.100/examples/windows/appinst/AppInstExample.dof create mode 100644 official/1.100/examples/windows/appinst/AppInstExample.dpr create mode 100644 official/1.100/examples/windows/appinst/AppInstExample.res create mode 100644 official/1.100/examples/windows/appinst/SingleInstDemoMain.dfm create mode 100644 official/1.100/examples/windows/appinst/SingleInstDemoMain.pas create mode 100644 official/1.100/examples/windows/appinst/SingleInstExample.dof create mode 100644 official/1.100/examples/windows/appinst/SingleInstExample.dpr create mode 100644 official/1.100/examples/windows/appinst/SingleInstExample.res create mode 100644 official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.dfm create mode 100644 official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.pas create mode 100644 official/1.100/examples/windows/asuser/CreateProcAsUserExample.dof create mode 100644 official/1.100/examples/windows/asuser/CreateProcAsUserExample.dpr create mode 100644 official/1.100/examples/windows/asuser/CreateProcAsUserExample.res create mode 100644 official/1.100/examples/windows/clr/ClrDemo.dof create mode 100644 official/1.100/examples/windows/clr/ClrDemo.dpr create mode 100644 official/1.100/examples/windows/clr/ClrDemo.res create mode 100644 official/1.100/examples/windows/clr/ClrDemoAbstractFrame.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoAbstractFrame.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoBlobForm.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoBlobForm.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoCLRFrame.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoCLRFrame.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoGuidForm.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoGuidForm.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoMain.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoMain.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoStringsForm.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoStringsForm.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoTableForm.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoTableForm.pas create mode 100644 official/1.100/examples/windows/clr/ClrDemoUserStringsForm.dfm create mode 100644 official/1.100/examples/windows/clr/ClrDemoUserStringsForm.pas create mode 100644 official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.dfm create mode 100644 official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.pas create mode 100644 official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dof create mode 100644 official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dpr create mode 100644 official/1.100/examples/windows/debug/framestrack/FramesTrackExample.res create mode 100644 official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.dpr create mode 100644 official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.res create mode 100644 official/1.100/examples/windows/debug/reportconverter/formConverter.dfm create mode 100644 official/1.100/examples/windows/debug/reportconverter/formConverter.pas create mode 100644 official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.dfm create mode 100644 official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.pas create mode 100644 official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dof create mode 100644 official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dpr create mode 100644 official/1.100/examples/windows/debug/sourceloc/SourceLocExample.res create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.bdsproj create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dof create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dpr create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.res create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.tlb create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary_TLB.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComUnit.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.dfm create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.bdsproj create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dof create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dpr create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.res create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicUnit.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.bdsproj create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dof create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dpr create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.res create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.bdsproj create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dof create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dpr create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.res create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticUnit.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.dfm create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.pas create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackExample.bdsproj create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dof create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dpr create mode 100644 official/1.100/examples/windows/debug/stacktrack/StackTrackExample.res create mode 100644 official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.dfm create mode 100644 official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.pas create mode 100644 official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dof create mode 100644 official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dpr create mode 100644 official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.res create mode 100644 official/1.100/examples/windows/delphitools/DelphiToolsGroup.bpg create mode 100644 official/1.100/examples/windows/delphitools/Readme.txt create mode 100644 official/1.100/examples/windows/delphitools/common/About.dfm create mode 100644 official/1.100/examples/windows/delphitools/common/About.pas create mode 100644 official/1.100/examples/windows/delphitools/common/D6MdiMsgFix.pas create mode 100644 official/1.100/examples/windows/delphitools/common/FindDlg.dfm create mode 100644 official/1.100/examples/windows/delphitools/common/FindDlg.pas create mode 100644 official/1.100/examples/windows/delphitools/common/SHDocVw_TLB.pas create mode 100644 official/1.100/examples/windows/delphitools/common/ToolsUtils.pas create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dof create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dpr create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/DependView.res create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/DependViewMain.dfm create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/DependViewMain.pas create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.dfm create mode 100644 official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeDump.dfm create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeDump.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeGenDef.dfm create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeGenDef.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeResView.dfm create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeResView.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeResource.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeSearch.dfm create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeSearch.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewer.dof create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewer.dpr create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewer.res create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewer.tlb create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewerControl.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.dfm create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.pas create mode 100644 official/1.100/examples/windows/delphitools/peviewer/PeViewer_TLB.pas create mode 100644 official/1.100/examples/windows/delphitools/resfix/ResFix.dof create mode 100644 official/1.100/examples/windows/delphitools/resfix/ResFix.dpr create mode 100644 official/1.100/examples/windows/delphitools/resfix/ResFix.res create mode 100644 official/1.100/examples/windows/delphitools/resfix/ResFixMain.dfm create mode 100644 official/1.100/examples/windows/delphitools/resfix/ResFixMain.pas create mode 100644 official/1.100/examples/windows/delphitools/screenjpg/Main.dfm create mode 100644 official/1.100/examples/windows/delphitools/screenjpg/Main.pas create mode 100644 official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dof create mode 100644 official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dpr create mode 100644 official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.res create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ChangePriority.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ChangePriority.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/Global.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/Global.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/Main.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/Main.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.pas create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dof create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dpr create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.res create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.dfm create mode 100644 official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.pas create mode 100644 official/1.100/examples/windows/edisdk/Clean.bat create mode 100644 official/1.100/examples/windows/edisdk/EDICOMExample.dof create mode 100644 official/1.100/examples/windows/edisdk/EDICOMExample.dpr create mode 100644 official/1.100/examples/windows/edisdk/EDICOMExample.res create mode 100644 official/1.100/examples/windows/edisdk/EDICOMExampleMain.dfm create mode 100644 official/1.100/examples/windows/edisdk/EDICOMExampleMain.pas create mode 100644 official/1.100/examples/windows/edisdk/EDISDK_TLB.dcr create mode 100644 official/1.100/examples/windows/edisdk/EDISDK_TLB.pas create mode 100644 official/1.100/examples/windows/edisdk/comserver/Clean.bat create mode 100644 official/1.100/examples/windows/edisdk/comserver/EDISDK.dof create mode 100644 official/1.100/examples/windows/edisdk/comserver/EDISDK.dpr create mode 100644 official/1.100/examples/windows/edisdk/comserver/EDISDK.res create mode 100644 official/1.100/examples/windows/edisdk/comserver/EDISDK.tlb create mode 100644 official/1.100/examples/windows/edisdk/comserver/EDISDK_TLB.pas create mode 100644 official/1.100/examples/windows/edisdk/comserver/JclEDICOM_ANSIX12.pas create mode 100644 official/1.100/examples/windows/edisdk/comserver/sample.edi create mode 100644 official/1.100/examples/windows/edisdk/sample.edi create mode 100644 official/1.100/examples/windows/edisdk/vb5/Form1.frm create mode 100644 official/1.100/examples/windows/edisdk/vb5/Form1.frx create mode 100644 official/1.100/examples/windows/edisdk/vb5/Project1.vbp create mode 100644 official/1.100/examples/windows/edisdk/vb5/Project1.vbw create mode 100644 official/1.100/examples/windows/edisdk/vb5/sample.edi create mode 100644 official/1.100/examples/windows/filesummary/FileSummaryDemoMain.dfm create mode 100644 official/1.100/examples/windows/filesummary/FileSummaryDemoMain.pas create mode 100644 official/1.100/examples/windows/filesummary/FileSummaryExample.dof create mode 100644 official/1.100/examples/windows/filesummary/FileSummaryExample.dpr create mode 100644 official/1.100/examples/windows/filesummary/FileSummaryExample.res create mode 100644 official/1.100/examples/windows/fileversion/VerInfoDemoMain.dfm create mode 100644 official/1.100/examples/windows/fileversion/VerInfoDemoMain.pas create mode 100644 official/1.100/examples/windows/fileversion/VerInfoExample.dof create mode 100644 official/1.100/examples/windows/fileversion/VerInfoExample.dpr create mode 100644 official/1.100/examples/windows/fileversion/VerInfoExample.res create mode 100644 official/1.100/examples/windows/lanman/LanManDemoMain.dfm create mode 100644 official/1.100/examples/windows/lanman/LanManDemoMain.pas create mode 100644 official/1.100/examples/windows/lanman/LanManExample.dof create mode 100644 official/1.100/examples/windows/lanman/LanManExample.dpr create mode 100644 official/1.100/examples/windows/lanman/LanManExample.res create mode 100644 official/1.100/examples/windows/locales/LocalesDemoMain.dfm create mode 100644 official/1.100/examples/windows/locales/LocalesDemoMain.pas create mode 100644 official/1.100/examples/windows/locales/LocalesExample.dof create mode 100644 official/1.100/examples/windows/locales/LocalesExample.dpr create mode 100644 official/1.100/examples/windows/locales/LocalesExample.res create mode 100644 official/1.100/examples/windows/mapi/MapiDemoMain.dfm create mode 100644 official/1.100/examples/windows/mapi/MapiDemoMain.pas create mode 100644 official/1.100/examples/windows/mapi/MapiExample.dof create mode 100644 official/1.100/examples/windows/mapi/MapiExample.dpr create mode 100644 official/1.100/examples/windows/mapi/MapiExample.res create mode 100644 official/1.100/examples/windows/mapi/ReadMailDemoMain.dfm create mode 100644 official/1.100/examples/windows/mapi/ReadMailDemoMain.pas create mode 100644 official/1.100/examples/windows/mapi/ReadMailExample.dof create mode 100644 official/1.100/examples/windows/mapi/ReadMailExample.dpr create mode 100644 official/1.100/examples/windows/mapi/ReadMailExample.res create mode 100644 official/1.100/examples/windows/multimedia/MultiMediaExample.dof create mode 100644 official/1.100/examples/windows/multimedia/MultiMediaExample.dpr create mode 100644 official/1.100/examples/windows/multimedia/MultiMediaExample.res create mode 100644 official/1.100/examples/windows/multimedia/MultimediaDemoMain.dfm create mode 100644 official/1.100/examples/windows/multimedia/MultimediaDemoMain.pas create mode 100644 official/1.100/examples/windows/ntfs/JEDISoftLinks.dof create mode 100644 official/1.100/examples/windows/ntfs/JEDISoftLinks.dpr create mode 100644 official/1.100/examples/windows/ntfs/JEDISoftLinks.tlb create mode 100644 official/1.100/examples/windows/ntfs/JEDISoftLinks_TLB.pas create mode 100644 official/1.100/examples/windows/ntfs/SoftLinkDragDropHandler.pas create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoDependent.dfm create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoDependent.pas create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoGroups.dfm create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoGroups.pas create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoMain.dfm create mode 100644 official/1.100/examples/windows/ntservice/NtSvcDemoMain.pas create mode 100644 official/1.100/examples/windows/ntservice/NtSvcExample.dof create mode 100644 official/1.100/examples/windows/ntservice/NtSvcExample.dpr create mode 100644 official/1.100/examples/windows/ntservice/NtSvcExample.res create mode 100644 official/1.100/examples/windows/peimage/ApiHookDemoMain.dfm create mode 100644 official/1.100/examples/windows/peimage/ApiHookDemoMain.pas create mode 100644 official/1.100/examples/windows/peimage/ApiHookExample.dof create mode 100644 official/1.100/examples/windows/peimage/ApiHookExample.dpr create mode 100644 official/1.100/examples/windows/peimage/ApiHookExample.res create mode 100644 official/1.100/examples/windows/peimage/PeFuncDemoMain.dfm create mode 100644 official/1.100/examples/windows/peimage/PeFuncDemoMain.pas create mode 100644 official/1.100/examples/windows/peimage/PeFuncExample.dof create mode 100644 official/1.100/examples/windows/peimage/PeFuncExample.dpr create mode 100644 official/1.100/examples/windows/peimage/PeFuncExample.res create mode 100644 official/1.100/examples/windows/peimage/UnmangleNameDemoMain.dfm create mode 100644 official/1.100/examples/windows/peimage/UnmangleNameDemoMain.pas create mode 100644 official/1.100/examples/windows/peimage/UnmangleNameExample.dof create mode 100644 official/1.100/examples/windows/peimage/UnmangleNameExample.dpr create mode 100644 official/1.100/examples/windows/peimage/UnmangleNameExample.res create mode 100644 official/1.100/examples/windows/registry/RegistryDemoMain.dfm create mode 100644 official/1.100/examples/windows/registry/RegistryDemoMain.pas create mode 100644 official/1.100/examples/windows/registry/RegistryExample.dof create mode 100644 official/1.100/examples/windows/registry/RegistryExample.dpr create mode 100644 official/1.100/examples/windows/registry/RegistryExample.res create mode 100644 official/1.100/examples/windows/structstorage/HexDump.pas create mode 100644 official/1.100/examples/windows/structstorage/PropsFrm.dfm create mode 100644 official/1.100/examples/windows/structstorage/PropsFrm.pas create mode 100644 official/1.100/examples/windows/structstorage/StructStorageExample.dof create mode 100644 official/1.100/examples/windows/structstorage/StructStorageExample.dpr create mode 100644 official/1.100/examples/windows/structstorage/StructStorageExample.res create mode 100644 official/1.100/examples/windows/structstorage/StructStorageExampleMain.dfm create mode 100644 official/1.100/examples/windows/structstorage/StructStorageExampleMain.pas create mode 100644 official/1.100/examples/windows/sysinfo/SysInfoDemoMain.dfm create mode 100644 official/1.100/examples/windows/sysinfo/SysInfoDemoMain.pas create mode 100644 official/1.100/examples/windows/sysinfo/SysInfoExample.dof create mode 100644 official/1.100/examples/windows/sysinfo/SysInfoExample.dpr create mode 100644 official/1.100/examples/windows/sysinfo/SysInfoExample.res create mode 100644 official/1.100/examples/windows/tasks/TaskDemo.dof create mode 100644 official/1.100/examples/windows/tasks/TaskDemo.dpr create mode 100644 official/1.100/examples/windows/tasks/TaskDemo.res create mode 100644 official/1.100/examples/windows/tasks/TaskDemoDataModule.dfm create mode 100644 official/1.100/examples/windows/tasks/TaskDemoDataModule.pas create mode 100644 official/1.100/examples/windows/tasks/TaskDemoMain.dfm create mode 100644 official/1.100/examples/windows/tasks/TaskDemoMain.pas create mode 100644 official/1.100/experts/common/JclConfigure.ico create mode 100644 official/1.100/experts/common/JclImages.rc create mode 100644 official/1.100/experts/common/JclImages.res create mode 100644 official/1.100/experts/common/JclOtaActionConfigureSheet.dfm create mode 100644 official/1.100/experts/common/JclOtaActionConfigureSheet.pas create mode 100644 official/1.100/experts/common/JclOtaConfigurationForm.dfm create mode 100644 official/1.100/experts/common/JclOtaConfigurationForm.pas create mode 100644 official/1.100/experts/common/JclOtaConsts.pas create mode 100644 official/1.100/experts/common/JclOtaExceptionForm.dfm create mode 100644 official/1.100/experts/common/JclOtaExceptionForm.pas create mode 100644 official/1.100/experts/common/JclOtaResources.pas create mode 100644 official/1.100/experts/common/JclOtaUtils.pas create mode 100644 official/1.100/experts/common/JclOtaWizardForm.dfm create mode 100644 official/1.100/experts/common/JclOtaWizardForm.pas create mode 100644 official/1.100/experts/common/JclOtaWizardFrame.dfm create mode 100644 official/1.100/experts/common/JclOtaWizardFrame.pas create mode 100644 official/1.100/experts/common/JclSplash.bmp create mode 100644 official/1.100/experts/debug/Howto.txt create mode 100644 official/1.100/experts/debug/JclDebugThread.pas create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeConfigFrame.dfm create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeConfigFrame.pas create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeIcon.res create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeImpl.pas create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeResult.dfm create mode 100644 official/1.100/experts/debug/converter/JclDebugIdeResult.pas create mode 100644 official/1.100/experts/debug/dialog/ClxExceptDlg.ico create mode 100644 official/1.100/experts/debug/dialog/ClxExceptDlg.pas create mode 100644 official/1.100/experts/debug/dialog/ClxExceptDlg.xfm create mode 100644 official/1.100/experts/debug/dialog/CreateStdDialogs.dpr create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.CBuilder32.cpp create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.CBuilder32.dfm create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.CBuilder32.h create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.Delphi32.dfm create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.Delphi32.pas create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.dfm create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.ico create mode 100644 official/1.100/experts/debug/dialog/ExceptDlg.pas create mode 100644 official/1.100/experts/debug/dialog/ExceptDlgCpp.ico create mode 100644 official/1.100/experts/debug/dialog/ExceptDlgMail.dfm create mode 100644 official/1.100/experts/debug/dialog/ExceptDlgMail.ico create mode 100644 official/1.100/experts/debug/dialog/ExceptDlgMail.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgFileFrame.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgFileFrame.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgFormFrame.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgFormFrame.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgIcons.RES create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgIcons.rc create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgIgnoreFrame.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgIgnoreFrame.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgRepository.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgSystemFrame.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgSystemFrame.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgTraceFrame.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgTraceFrame.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgWizard.dfm create mode 100644 official/1.100/experts/debug/dialog/JclOtaExcDlgWizard.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaRepositoryReg.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaRepositoryUtils.pas create mode 100644 official/1.100/experts/debug/dialog/JclOtaTemplates.pas create mode 100644 official/1.100/experts/debug/simdview/JclSIMDCpuInfo.dfm create mode 100644 official/1.100/experts/debug/simdview/JclSIMDCpuInfo.pas create mode 100644 official/1.100/experts/debug/simdview/JclSIMDIcon.dcr create mode 100644 official/1.100/experts/debug/simdview/JclSIMDModifyForm.dfm create mode 100644 official/1.100/experts/debug/simdview/JclSIMDModifyForm.pas create mode 100644 official/1.100/experts/debug/simdview/JclSIMDTestBCB.cpp create mode 100644 official/1.100/experts/debug/simdview/JclSIMDTestBCBProject.bpf create mode 100644 official/1.100/experts/debug/simdview/JclSIMDTestBCBProject.bpr create mode 100644 official/1.100/experts/debug/simdview/JclSIMDTestDelphi.dpr create mode 100644 official/1.100/experts/debug/simdview/JclSIMDUtils.pas create mode 100644 official/1.100/experts/debug/simdview/JclSIMDView.pas create mode 100644 official/1.100/experts/debug/simdview/JclSIMDViewForm.dfm create mode 100644 official/1.100/experts/debug/simdview/JclSIMDViewForm.pas create mode 100644 official/1.100/experts/debug/threadnames/JclIdeThreadStatus.pas create mode 100644 official/1.100/experts/debug/threadnames/ThreadExpertSharedNames.pas create mode 100644 official/1.100/experts/debug/threadnames/ThreadExpertUnit.pas create mode 100644 official/1.100/experts/debug/tools/MakeJclDbg.dof create mode 100644 official/1.100/experts/debug/tools/MakeJclDbg.dpr create mode 100644 official/1.100/experts/debug/tools/MapToJdbg.dof create mode 100644 official/1.100/experts/debug/tools/MapToJdbg.dpr create mode 100644 official/1.100/experts/debug/tools/MapToJdbg.res create mode 100644 official/1.100/experts/debug/tools/MapToJdbgMain.dfm create mode 100644 official/1.100/experts/debug/tools/MapToJdbgMain.pas create mode 100644 official/1.100/experts/debug/tools/TlbToMap.dof create mode 100644 official/1.100/experts/debug/tools/TlbToMap.dpr create mode 100644 official/1.100/experts/debug/tools/TlbToMap.res create mode 100644 official/1.100/experts/debug/tools/TlbToMapMain.dfm create mode 100644 official/1.100/experts/debug/tools/TlbToMapMain.pas create mode 100644 official/1.100/experts/debug/tools/Tools.bpg create mode 100644 official/1.100/experts/debug/tools/makejcldbg.res create mode 100644 official/1.100/experts/favfolders/FavDlg.rc create mode 100644 official/1.100/experts/favfolders/FavDlg.res create mode 100644 official/1.100/experts/favfolders/IdeOpenDlgFavoriteUnit.pas create mode 100644 official/1.100/experts/favfolders/OpenDlgFavAdapter.pas create mode 100644 official/1.100/experts/projectanalyzer/ProjAnalyzerFrm.dfm create mode 100644 official/1.100/experts/projectanalyzer/ProjAnalyzerFrm.pas create mode 100644 official/1.100/experts/projectanalyzer/ProjAnalyzerIcon.res create mode 100644 official/1.100/experts/projectanalyzer/ProjAnalyzerImpl.pas create mode 100644 official/1.100/experts/useswizard/Hardlinks.txt create mode 100644 official/1.100/experts/useswizard/History.txt create mode 100644 official/1.100/experts/useswizard/IdentifierList.dpr create mode 100644 official/1.100/experts/useswizard/JCLOptionsFrame.dfm create mode 100644 official/1.100/experts/useswizard/JCLOptionsFrame.pas create mode 100644 official/1.100/experts/useswizard/JCLUsesWizard.pas create mode 100644 official/1.100/experts/useswizard/Jcl8087.txt create mode 100644 official/1.100/experts/useswizard/JclAbstractContainers.txt create mode 100644 official/1.100/experts/useswizard/JclAlgorithms.txt create mode 100644 official/1.100/experts/useswizard/JclAnsiStrings.txt create mode 100644 official/1.100/experts/useswizard/JclAppInst.txt create mode 100644 official/1.100/experts/useswizard/JclArrayLists.txt create mode 100644 official/1.100/experts/useswizard/JclArraySets.txt create mode 100644 official/1.100/experts/useswizard/JclBase.txt create mode 100644 official/1.100/experts/useswizard/JclBinaryTrees.txt create mode 100644 official/1.100/experts/useswizard/JclBorlandTools.txt create mode 100644 official/1.100/experts/useswizard/JclCIL.txt create mode 100644 official/1.100/experts/useswizard/JclCLR.txt create mode 100644 official/1.100/experts/useswizard/JclCOM.txt create mode 100644 official/1.100/experts/useswizard/JclComplex.txt create mode 100644 official/1.100/experts/useswizard/JclCompression.txt create mode 100644 official/1.100/experts/useswizard/JclConsole.txt create mode 100644 official/1.100/experts/useswizard/JclContainerIntf.txt create mode 100644 official/1.100/experts/useswizard/JclCounter.txt create mode 100644 official/1.100/experts/useswizard/JclDateTime.txt create mode 100644 official/1.100/experts/useswizard/JclDebug.txt create mode 100644 official/1.100/experts/useswizard/JclDotNet.txt create mode 100644 official/1.100/experts/useswizard/JclEDI.txt create mode 100644 official/1.100/experts/useswizard/JclEDISEF.txt create mode 100644 official/1.100/experts/useswizard/JclEDITranslators.txt create mode 100644 official/1.100/experts/useswizard/JclEDIXML.txt create mode 100644 official/1.100/experts/useswizard/JclEDI_ANSIX12.txt create mode 100644 official/1.100/experts/useswizard/JclEDI_ANSIX12_Ext.txt create mode 100644 official/1.100/experts/useswizard/JclEDI_UNEDIFACT.txt create mode 100644 official/1.100/experts/useswizard/JclEDI_UNEDIFACT_Ext.txt create mode 100644 official/1.100/experts/useswizard/JclExprEval.txt create mode 100644 official/1.100/experts/useswizard/JclFileUtils.txt create mode 100644 official/1.100/experts/useswizard/JclGraphUtils.txt create mode 100644 official/1.100/experts/useswizard/JclGraphics.txt create mode 100644 official/1.100/experts/useswizard/JclHashMaps.txt create mode 100644 official/1.100/experts/useswizard/JclHashSets.txt create mode 100644 official/1.100/experts/useswizard/JclHookExcept.txt create mode 100644 official/1.100/experts/useswizard/JclIniFiles.txt create mode 100644 official/1.100/experts/useswizard/JclLANMan.txt create mode 100644 official/1.100/experts/useswizard/JclLinkedLists.txt create mode 100644 official/1.100/experts/useswizard/JclLocales.txt create mode 100644 official/1.100/experts/useswizard/JclLogic.txt create mode 100644 official/1.100/experts/useswizard/JclMIDI.txt create mode 100644 official/1.100/experts/useswizard/JclMapi.txt create mode 100644 official/1.100/experts/useswizard/JclMath.txt create mode 100644 official/1.100/experts/useswizard/JclMetadata.txt create mode 100644 official/1.100/experts/useswizard/JclMime.txt create mode 100644 official/1.100/experts/useswizard/JclMiscel.txt create mode 100644 official/1.100/experts/useswizard/JclMsdosSys.txt create mode 100644 official/1.100/experts/useswizard/JclMultimedia.txt create mode 100644 official/1.100/experts/useswizard/JclNTFS.txt create mode 100644 official/1.100/experts/useswizard/JclPCRE.txt create mode 100644 official/1.100/experts/useswizard/JclParseUses.pas create mode 100644 official/1.100/experts/useswizard/JclPeImage.txt create mode 100644 official/1.100/experts/useswizard/JclPrint.txt create mode 100644 official/1.100/experts/useswizard/JclQGraphUtils.txt create mode 100644 official/1.100/experts/useswizard/JclQGraphics.txt create mode 100644 official/1.100/experts/useswizard/JclQueues.txt create mode 100644 official/1.100/experts/useswizard/JclRTF.txt create mode 100644 official/1.100/experts/useswizard/JclRTTI.txt create mode 100644 official/1.100/experts/useswizard/JclRegistry.txt create mode 100644 official/1.100/experts/useswizard/JclResources.txt create mode 100644 official/1.100/experts/useswizard/JclSchedule.txt create mode 100644 official/1.100/experts/useswizard/JclSecurity.txt create mode 100644 official/1.100/experts/useswizard/JclShell.txt create mode 100644 official/1.100/experts/useswizard/JclStacks.txt create mode 100644 official/1.100/experts/useswizard/JclStatistics.txt create mode 100644 official/1.100/experts/useswizard/JclStrHashMap.txt create mode 100644 official/1.100/experts/useswizard/JclStreams.txt create mode 100644 official/1.100/experts/useswizard/JclStrings.txt create mode 100644 official/1.100/experts/useswizard/JclStructStorage.txt create mode 100644 official/1.100/experts/useswizard/JclSvcCtrl.txt create mode 100644 official/1.100/experts/useswizard/JclSynch.txt create mode 100644 official/1.100/experts/useswizard/JclSysInfo.txt create mode 100644 official/1.100/experts/useswizard/JclSysUtils.txt create mode 100644 official/1.100/experts/useswizard/JclTD32.txt create mode 100644 official/1.100/experts/useswizard/JclTask.txt create mode 100644 official/1.100/experts/useswizard/JclUnicode.txt create mode 100644 official/1.100/experts/useswizard/JclUnitConv.txt create mode 100644 official/1.100/experts/useswizard/JclUnitVersioning.txt create mode 100644 official/1.100/experts/useswizard/JclUnitVersioningProviders.txt create mode 100644 official/1.100/experts/useswizard/JclUsesDialog.dfm create mode 100644 official/1.100/experts/useswizard/JclUsesDialog.pas create mode 100644 official/1.100/experts/useswizard/JclValidation.txt create mode 100644 official/1.100/experts/useswizard/JclVectors.txt create mode 100644 official/1.100/experts/useswizard/JclWideFormat.txt create mode 100644 official/1.100/experts/useswizard/JclWideStrings.txt create mode 100644 official/1.100/experts/useswizard/JclWin32.txt create mode 100644 official/1.100/experts/useswizard/JclWin32Ex.txt create mode 100644 official/1.100/experts/useswizard/JclWinMIDI.txt create mode 100644 official/1.100/experts/useswizard/JediUsesWizard.ini create mode 100644 official/1.100/experts/useswizard/ReadMe.txt create mode 100644 official/1.100/experts/useswizard/pcre.txt create mode 100644 official/1.100/experts/versioncontrol/JclVersionCtrlCVSImpl.pas create mode 100644 official/1.100/experts/versioncontrol/JclVersionCtrlCommonOptions.dfm create mode 100644 official/1.100/experts/versioncontrol/JclVersionCtrlCommonOptions.pas create mode 100644 official/1.100/experts/versioncontrol/JclVersionCtrlSVNImpl.pas create mode 100644 official/1.100/experts/versioncontrol/VersionControlImpl.pas create mode 100644 official/1.100/include/zconf.h create mode 100644 official/1.100/include/zlib.h create mode 100644 official/1.100/include/zutil.h create mode 100644 official/1.100/install.sh create mode 100644 official/1.100/install/BCB5-dcc32.cfg.mak create mode 100644 official/1.100/install/ClxGui/QJediGUIInstall.xfm create mode 100644 official/1.100/install/ClxGui/QJediGUIMain.xfm create mode 100644 official/1.100/install/ClxGui/QJediGUIReadme.xfm create mode 100644 official/1.100/install/JclInstall.pas create mode 100644 official/1.100/install/JediInstall.pas create mode 100644 official/1.100/install/JediInstallConfigIni.pas create mode 100644 official/1.100/install/JediInstaller.bdsproj create mode 100644 official/1.100/install/JediInstaller.dof create mode 100644 official/1.100/install/JediInstaller.dpr create mode 100644 official/1.100/install/JediInstaller.res create mode 100644 official/1.100/install/JediRegInfo.pas create mode 100644 official/1.100/install/QJediInstaller.conf create mode 100644 official/1.100/install/QJediInstaller.dof create mode 100644 official/1.100/install/QJediInstaller.dpr create mode 100644 official/1.100/install/QJediInstaller.kof create mode 100644 official/1.100/install/QJediInstaller.res create mode 100644 official/1.100/install/RegHelper.dof create mode 100644 official/1.100/install/RegHelper.dpr create mode 100644 official/1.100/install/RegHelper.rc create mode 100644 official/1.100/install/RegHelper.res create mode 100644 official/1.100/install/VclGui/FrmCompile.dfm create mode 100644 official/1.100/install/VclGui/FrmCompile.pas create mode 100644 official/1.100/install/VclGui/JediGUIInstall.dfm create mode 100644 official/1.100/install/VclGui/JediGUIMain.dfm create mode 100644 official/1.100/install/VclGui/JediGUIReadme.dfm create mode 100644 official/1.100/install/build/build.bdsproj create mode 100644 official/1.100/install/build/build.dpr create mode 100644 official/1.100/install/build/build.exe create mode 100644 official/1.100/install/build/dcc32ex.dpr create mode 100644 official/1.100/install/build/dcc32ex.exe create mode 100644 official/1.100/install/build/makefile.mak create mode 100644 official/1.100/install/build/pgEdit.xml create mode 100644 official/1.100/install/build/pretest.bat create mode 100644 official/1.100/install/makefile.mak create mode 100644 official/1.100/install/prototypes.mak create mode 100644 official/1.100/install/prototypes.sh create mode 100644 official/1.100/install/prototypes/JediGUIInstall.pas create mode 100644 official/1.100/install/prototypes/JediGUIMain.pas create mode 100644 official/1.100/install/prototypes/JediGUIReadme.pas create mode 100644 official/1.100/lib/c5/debug/dirinfo.txt create mode 100644 official/1.100/lib/c5/dirinfo.txt create mode 100644 official/1.100/lib/c5/obj/dirinfo.txt create mode 100644 official/1.100/lib/c5/windows.exc create mode 100644 official/1.100/lib/c6/debug/dirinfo.txt create mode 100644 official/1.100/lib/c6/dirinfo.txt create mode 100644 official/1.100/lib/c6/obj/dirinfo.txt create mode 100644 official/1.100/lib/c6/windows.exc create mode 100644 official/1.100/lib/cs1/dirinfo.txt create mode 100644 official/1.100/lib/d10.net/common.exc create mode 100644 official/1.100/lib/d10.net/debug/dirinfo.txt create mode 100644 official/1.100/lib/d10.net/dirinfo.txt create mode 100644 official/1.100/lib/d10.net/vcl.exc create mode 100644 official/1.100/lib/d10.net/windows.exc create mode 100644 official/1.100/lib/d10/debug/dirinfo.txt create mode 100644 official/1.100/lib/d10/dirinfo.txt create mode 100644 official/1.100/lib/d11/debug/dirinfo.txt create mode 100644 official/1.100/lib/d11/dirinfo.txt create mode 100644 official/1.100/lib/d5/debug/dirinfo.txt create mode 100644 official/1.100/lib/d5/dirinfo.txt create mode 100644 official/1.100/lib/d5/windows.exc create mode 100644 official/1.100/lib/d6/debug/dirinfo.txt create mode 100644 official/1.100/lib/d6/dirinfo.txt create mode 100644 official/1.100/lib/d6/windows.exc create mode 100644 official/1.100/lib/d7/debug/dirinfo.txt create mode 100644 official/1.100/lib/d7/dirinfo.txt create mode 100644 official/1.100/lib/d7/windows.exc create mode 100644 official/1.100/lib/d8/dirinfo.txt create mode 100644 official/1.100/lib/d9.net/common.exc create mode 100644 official/1.100/lib/d9.net/debug/dirinfo.txt create mode 100644 official/1.100/lib/d9.net/dirinfo.txt create mode 100644 official/1.100/lib/d9.net/vcl.exc create mode 100644 official/1.100/lib/d9.net/windows.exc create mode 100644 official/1.100/lib/d9/debug/dirinfo.txt create mode 100644 official/1.100/lib/d9/dirinfo.txt create mode 100644 official/1.100/lib/d9/windows.exc create mode 100644 official/1.100/lib/dirinfo.txt create mode 100644 official/1.100/lib/k3/debug/dirinfo.txt create mode 100644 official/1.100/lib/k3/dirinfo.txt create mode 100644 official/1.100/lib/k3/obj/dirinfo.txt create mode 100644 official/1.100/packages/BCB.bmk create mode 100644 official/1.100/packages/JclNetPackagesD100.bdsgroup create mode 100644 official/1.100/packages/JclNetPackagesD90.bdsgroup create mode 100644 official/1.100/packages/JclPackagesC50.bpg create mode 100644 official/1.100/packages/JclPackagesC60.bpg create mode 100644 official/1.100/packages/JclPackagesCK3.bpg create mode 100644 official/1.100/packages/JclPackagesD100.bdsgroup create mode 100644 official/1.100/packages/JclPackagesD110.bdsgroup create mode 100644 official/1.100/packages/JclPackagesD110.groupproj create mode 100644 official/1.100/packages/JclPackagesD50.bpg create mode 100644 official/1.100/packages/JclPackagesD60.bpg create mode 100644 official/1.100/packages/JclPackagesD70.bpg create mode 100644 official/1.100/packages/JclPackagesD90.bdsgroup create mode 100644 official/1.100/packages/JclPackagesDK3.bpg create mode 100644 official/1.100/packages/bcb.gmk create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.dof create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.rc create mode 100644 official/1.100/packages/c5/JclBaseExpertC50.res create mode 100644 official/1.100/packages/c5/JclC50.bpk create mode 100644 official/1.100/packages/c5/JclC50.cpp create mode 100644 official/1.100/packages/c5/JclC50.dof create mode 100644 official/1.100/packages/c5/JclC50.dpk create mode 100644 official/1.100/packages/c5/JclC50.rc create mode 100644 official/1.100/packages/c5/JclC50.res create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.RES create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.dof create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclDebugExpertC50.rc create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclDebugExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.dof create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.rc create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertC50.res create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclFavoriteFoldersExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.RES create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.dof create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertC50.rc create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclProjectAnalysisExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.dof create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.rc create mode 100644 official/1.100/packages/c5/JclRepositoryExpertC50.res create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclRepositoryExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.dof create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.rc create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertC50.res create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclSIMDViewExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.RES create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.dof create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclThreadNameExpertC50.rc create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclThreadNameExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.RES create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.dof create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclUsesExpertC50.rc create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclUsesExpertDLLC50.res create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.bpk create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.cpp create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.dof create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.dpk create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.rc create mode 100644 official/1.100/packages/c5/JclVersionControlExpertC50.res create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.bpf create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.bpr create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.cpp create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.dof create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.rc create mode 100644 official/1.100/packages/c5/JclVersionControlExpertDLLC50.res create mode 100644 official/1.100/packages/c5/dirinfo.txt create mode 100644 official/1.100/packages/c5/template.bpf create mode 100644 official/1.100/packages/c5/template.bpk create mode 100644 official/1.100/packages/c5/template.bpr create mode 100644 official/1.100/packages/c5/template.cpp create mode 100644 official/1.100/packages/c5/template.dof create mode 100644 official/1.100/packages/c5/template.dpk create mode 100644 official/1.100/packages/c5/template.rc create mode 100644 official/1.100/packages/c6/Jcl.RES create mode 100644 official/1.100/packages/c6/Jcl.bpk create mode 100644 official/1.100/packages/c6/Jcl.cpp create mode 100644 official/1.100/packages/c6/Jcl.dof create mode 100644 official/1.100/packages/c6/Jcl.dpk create mode 100644 official/1.100/packages/c6/Jcl.rc create mode 100644 official/1.100/packages/c6/JclBaseExpert.bpk create mode 100644 official/1.100/packages/c6/JclBaseExpert.cpp create mode 100644 official/1.100/packages/c6/JclBaseExpert.dof create mode 100644 official/1.100/packages/c6/JclBaseExpert.dpk create mode 100644 official/1.100/packages/c6/JclBaseExpert.rc create mode 100644 official/1.100/packages/c6/JclBaseExpert.res create mode 100644 official/1.100/packages/c6/JclDebugExpert.RES create mode 100644 official/1.100/packages/c6/JclDebugExpert.bpk create mode 100644 official/1.100/packages/c6/JclDebugExpert.cpp create mode 100644 official/1.100/packages/c6/JclDebugExpert.dof create mode 100644 official/1.100/packages/c6/JclDebugExpert.dpk create mode 100644 official/1.100/packages/c6/JclDebugExpert.rc create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclDebugExpertDLL.res create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.RES create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.bpk create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.cpp create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.dof create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclFavoriteFoldersExpertDLL.res create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.RES create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.bpk create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.cpp create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.dof create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclProjectAnalysisExpertDLL.res create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.bpk create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.cpp create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.dof create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/c6/JclRepositoryExpert.res create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclRepositoryExpertDLL.res create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.bpk create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.cpp create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.dof create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/c6/JclSIMDViewExpert.res create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclSIMDViewExpertDLL.res create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.RES create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.bpk create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.cpp create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.dof create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/c6/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclThreadNameExpertDLL.res create mode 100644 official/1.100/packages/c6/JclUsesExpert.RES create mode 100644 official/1.100/packages/c6/JclUsesExpert.bpk create mode 100644 official/1.100/packages/c6/JclUsesExpert.cpp create mode 100644 official/1.100/packages/c6/JclUsesExpert.dof create mode 100644 official/1.100/packages/c6/JclUsesExpert.dpk create mode 100644 official/1.100/packages/c6/JclUsesExpert.rc create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclUsesExpertDLL.res create mode 100644 official/1.100/packages/c6/JclVClx.RES create mode 100644 official/1.100/packages/c6/JclVClx.bpk create mode 100644 official/1.100/packages/c6/JclVClx.cpp create mode 100644 official/1.100/packages/c6/JclVClx.dof create mode 100644 official/1.100/packages/c6/JclVClx.dpk create mode 100644 official/1.100/packages/c6/JclVClx.rc create mode 100644 official/1.100/packages/c6/JclVcl.RES create mode 100644 official/1.100/packages/c6/JclVcl.bpk create mode 100644 official/1.100/packages/c6/JclVcl.cpp create mode 100644 official/1.100/packages/c6/JclVcl.dof create mode 100644 official/1.100/packages/c6/JclVcl.dpk create mode 100644 official/1.100/packages/c6/JclVcl.rc create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.bpk create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.cpp create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.dof create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/c6/JclVersionControlExpert.res create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.bpf create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.bpr create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.cpp create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.dof create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/c6/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/c6/dirinfo.txt create mode 100644 official/1.100/packages/c6/template.bpf create mode 100644 official/1.100/packages/c6/template.bpk create mode 100644 official/1.100/packages/c6/template.bpr create mode 100644 official/1.100/packages/c6/template.cpp create mode 100644 official/1.100/packages/c6/template.dof create mode 100644 official/1.100/packages/c6/template.dpk create mode 100644 official/1.100/packages/c6/template.rc create mode 100644 official/1.100/packages/cs1/Jcl.RES create mode 100644 official/1.100/packages/cs1/Jcl.bdsproj create mode 100644 official/1.100/packages/cs1/Jcl.dpk create mode 100644 official/1.100/packages/cs1/Jcl.rc create mode 100644 official/1.100/packages/cs1/JclBaseExpert.RES create mode 100644 official/1.100/packages/cs1/JclBaseExpert.bdsproj create mode 100644 official/1.100/packages/cs1/JclBaseExpert.dpk create mode 100644 official/1.100/packages/cs1/JclBaseExpert.rc create mode 100644 official/1.100/packages/cs1/JclFavoriteFoldersExpertDLL.RES create mode 100644 official/1.100/packages/cs1/JclFavoriteFoldersExpertDLL.bdsproj create mode 100644 official/1.100/packages/cs1/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/cs1/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/cs1/JclVersionControlExpertDLL.bdsproj create mode 100644 official/1.100/packages/cs1/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/cs1/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/cs1/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/cs1/template.bdsproj create mode 100644 official/1.100/packages/cs1/template.dpk create mode 100644 official/1.100/packages/cs1/template.dpr create mode 100644 official/1.100/packages/cs1/template.rc create mode 100644 official/1.100/packages/d10.net/Jedi.Jcl.bdsproj create mode 100644 official/1.100/packages/d10.net/Jedi.Jcl.dpr create mode 100644 official/1.100/packages/d10.net/template.bdsproj create mode 100644 official/1.100/packages/d10.net/template.dpr create mode 100644 official/1.100/packages/d10/Jcl.bdsproj create mode 100644 official/1.100/packages/d10/Jcl.dpk create mode 100644 official/1.100/packages/d10/Jcl.rc create mode 100644 official/1.100/packages/d10/Jcl.res create mode 100644 official/1.100/packages/d10/JclBaseExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d10/JclBaseExpert.rc create mode 100644 official/1.100/packages/d10/JclBaseExpert.res create mode 100644 official/1.100/packages/d10/JclDebugExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclDebugExpert.dpk create mode 100644 official/1.100/packages/d10/JclDebugExpert.rc create mode 100644 official/1.100/packages/d10/JclDebugExpert.res create mode 100644 official/1.100/packages/d10/JclDebugExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclDebugExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclDebugExpertDLL.res create mode 100644 official/1.100/packages/d10/JclExperts.bdsgroup create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpert.res create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclFavoriteFoldersExpertDLL.res create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpert.RES create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclProjectAnalysisExpertDLL.res create mode 100644 official/1.100/packages/d10/JclRepositoryExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/d10/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/d10/JclRepositoryExpert.res create mode 100644 official/1.100/packages/d10/JclRepositoryExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclRepositoryExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclRepositoryExpertDLL.res create mode 100644 official/1.100/packages/d10/JclSIMDViewExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/d10/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/d10/JclSIMDViewExpert.res create mode 100644 official/1.100/packages/d10/JclSIMDViewExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclSIMDViewExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclSIMDViewExpertDLL.res create mode 100644 official/1.100/packages/d10/JclThreadNameExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/d10/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/d10/JclThreadNameExpert.res create mode 100644 official/1.100/packages/d10/JclThreadNameExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclThreadNameExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclThreadNameExpertDLL.res create mode 100644 official/1.100/packages/d10/JclVcl.bdsproj create mode 100644 official/1.100/packages/d10/JclVcl.dpk create mode 100644 official/1.100/packages/d10/JclVcl.rc create mode 100644 official/1.100/packages/d10/JclVcl.res create mode 100644 official/1.100/packages/d10/JclVersionControlExpert.bdsproj create mode 100644 official/1.100/packages/d10/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/d10/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/d10/JclVersionControlExpert.res create mode 100644 official/1.100/packages/d10/JclVersionControlExpertDLL.bdsproj create mode 100644 official/1.100/packages/d10/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d10/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d10/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/d10/template.bdsproj create mode 100644 official/1.100/packages/d10/template.dpk create mode 100644 official/1.100/packages/d10/template.dpr create mode 100644 official/1.100/packages/d10/template.rc create mode 100644 official/1.100/packages/d11/Jcl.dpk create mode 100644 official/1.100/packages/d11/Jcl.dproj create mode 100644 official/1.100/packages/d11/Jcl.rc create mode 100644 official/1.100/packages/d11/Jcl.res create mode 100644 official/1.100/packages/d11/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d11/JclBaseExpert.dproj create mode 100644 official/1.100/packages/d11/JclBaseExpert.rc create mode 100644 official/1.100/packages/d11/JclBaseExpert.res create mode 100644 official/1.100/packages/d11/JclDebugExpert.dpk create mode 100644 official/1.100/packages/d11/JclDebugExpert.dproj create mode 100644 official/1.100/packages/d11/JclDebugExpert.rc create mode 100644 official/1.100/packages/d11/JclDebugExpert.res create mode 100644 official/1.100/packages/d11/JclDebugExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclDebugExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpert.dproj create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpert.res create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpert.dproj create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpert.res create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/d11/JclRepositoryExpert.dproj create mode 100644 official/1.100/packages/d11/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/d11/JclRepositoryExpert.res create mode 100644 official/1.100/packages/d11/JclRepositoryExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclRepositoryExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/d11/JclSIMDViewExpert.dproj create mode 100644 official/1.100/packages/d11/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/d11/JclSIMDViewExpert.res create mode 100644 official/1.100/packages/d11/JclSIMDViewExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclSIMDViewExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/d11/JclThreadNameExpert.dproj create mode 100644 official/1.100/packages/d11/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/d11/JclThreadNameExpert.res create mode 100644 official/1.100/packages/d11/JclThreadNameExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclThreadNameExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/d11/JclVcl.dpk create mode 100644 official/1.100/packages/d11/JclVcl.dproj create mode 100644 official/1.100/packages/d11/JclVcl.rc create mode 100644 official/1.100/packages/d11/JclVcl.res create mode 100644 official/1.100/packages/d11/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/d11/JclVersionControlExpert.dproj create mode 100644 official/1.100/packages/d11/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/d11/JclVersionControlExpert.res create mode 100644 official/1.100/packages/d11/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d11/JclVersionControlExpertDLL.dproj create mode 100644 official/1.100/packages/d11/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d11/template.dpk create mode 100644 official/1.100/packages/d11/template.dpr create mode 100644 official/1.100/packages/d11/template.dproj create mode 100644 official/1.100/packages/d11/template.rc create mode 100644 official/1.100/packages/d5/JclBaseExpertD50.dof create mode 100644 official/1.100/packages/d5/JclBaseExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclBaseExpertD50.rc create mode 100644 official/1.100/packages/d5/JclBaseExpertD50.res create mode 100644 official/1.100/packages/d5/JclD50.RES create mode 100644 official/1.100/packages/d5/JclD50.dof create mode 100644 official/1.100/packages/d5/JclD50.dpk create mode 100644 official/1.100/packages/d5/JclD50.rc create mode 100644 official/1.100/packages/d5/JclDebugExpertD50.RES create mode 100644 official/1.100/packages/d5/JclDebugExpertD50.dof create mode 100644 official/1.100/packages/d5/JclDebugExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclDebugExpertD50.rc create mode 100644 official/1.100/packages/d5/JclDebugExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclDebugExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclDebugExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclDebugExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertD50.RES create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertD50.dof create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertD50.rc create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclFavoriteFoldersExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertD50.RES create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertD50.dof create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertD50.rc create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclProjectAnalysisExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclRepositoryExpertD50.dof create mode 100644 official/1.100/packages/d5/JclRepositoryExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclRepositoryExpertD50.rc create mode 100644 official/1.100/packages/d5/JclRepositoryExpertD50.res create mode 100644 official/1.100/packages/d5/JclRepositoryExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclRepositoryExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclRepositoryExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclRepositoryExpertDLLD50.res create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertD50.RES create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertD50.dof create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertD50.rc create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclSIMDViewExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclThreadNameExpertD50.RES create mode 100644 official/1.100/packages/d5/JclThreadNameExpertD50.dof create mode 100644 official/1.100/packages/d5/JclThreadNameExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclThreadNameExpertD50.rc create mode 100644 official/1.100/packages/d5/JclThreadNameExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclThreadNameExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclThreadNameExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclThreadNameExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclUsesExpertD50.RES create mode 100644 official/1.100/packages/d5/JclUsesExpertD50.dof create mode 100644 official/1.100/packages/d5/JclUsesExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclUsesExpertD50.rc create mode 100644 official/1.100/packages/d5/JclUsesExpertDLLD50.RES create mode 100644 official/1.100/packages/d5/JclUsesExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclUsesExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclUsesExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclVersionControlExpertD50.dof create mode 100644 official/1.100/packages/d5/JclVersionControlExpertD50.dpk create mode 100644 official/1.100/packages/d5/JclVersionControlExpertD50.rc create mode 100644 official/1.100/packages/d5/JclVersionControlExpertD50.res create mode 100644 official/1.100/packages/d5/JclVersionControlExpertDLLD50.dof create mode 100644 official/1.100/packages/d5/JclVersionControlExpertDLLD50.dpr create mode 100644 official/1.100/packages/d5/JclVersionControlExpertDLLD50.rc create mode 100644 official/1.100/packages/d5/JclVersionControlExpertDLLD50.res create mode 100644 official/1.100/packages/d5/dirinfo.txt create mode 100644 official/1.100/packages/d5/template.dof create mode 100644 official/1.100/packages/d5/template.dpk create mode 100644 official/1.100/packages/d5/template.dpr create mode 100644 official/1.100/packages/d5/template.rc create mode 100644 official/1.100/packages/d6/Jcl.dof create mode 100644 official/1.100/packages/d6/Jcl.dpk create mode 100644 official/1.100/packages/d6/Jcl.rc create mode 100644 official/1.100/packages/d6/Jcl.res create mode 100644 official/1.100/packages/d6/JclBaseExpert.dof create mode 100644 official/1.100/packages/d6/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d6/JclBaseExpert.rc create mode 100644 official/1.100/packages/d6/JclBaseExpert.res create mode 100644 official/1.100/packages/d6/JclDebugExpert.dof create mode 100644 official/1.100/packages/d6/JclDebugExpert.dpk create mode 100644 official/1.100/packages/d6/JclDebugExpert.rc create mode 100644 official/1.100/packages/d6/JclDebugExpert.res create mode 100644 official/1.100/packages/d6/JclDebugExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclDebugExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclDebugExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpert.dof create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpert.res create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpert.RES create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpert.dof create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclRepositoryExpert.dof create mode 100644 official/1.100/packages/d6/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/d6/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/d6/JclRepositoryExpert.res create mode 100644 official/1.100/packages/d6/JclRepositoryExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclRepositoryExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclRepositoryExpertDLL.res create mode 100644 official/1.100/packages/d6/JclSIMDViewExpert.dof create mode 100644 official/1.100/packages/d6/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/d6/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/d6/JclSIMDViewExpert.res create mode 100644 official/1.100/packages/d6/JclSIMDViewExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclSIMDViewExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclSIMDViewExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclThreadNameExpert.dof create mode 100644 official/1.100/packages/d6/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/d6/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/d6/JclThreadNameExpert.res create mode 100644 official/1.100/packages/d6/JclThreadNameExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclThreadNameExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclThreadNameExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclUsesExpert.dof create mode 100644 official/1.100/packages/d6/JclUsesExpert.dpk create mode 100644 official/1.100/packages/d6/JclUsesExpert.rc create mode 100644 official/1.100/packages/d6/JclUsesExpert.res create mode 100644 official/1.100/packages/d6/JclUsesExpertDLL.RES create mode 100644 official/1.100/packages/d6/JclUsesExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclUsesExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclUsesExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclVClx.dof create mode 100644 official/1.100/packages/d6/JclVClx.dpk create mode 100644 official/1.100/packages/d6/JclVClx.rc create mode 100644 official/1.100/packages/d6/JclVClx.res create mode 100644 official/1.100/packages/d6/JclVcl.dof create mode 100644 official/1.100/packages/d6/JclVcl.dpk create mode 100644 official/1.100/packages/d6/JclVcl.rc create mode 100644 official/1.100/packages/d6/JclVcl.res create mode 100644 official/1.100/packages/d6/JclVersionControlExpert.dof create mode 100644 official/1.100/packages/d6/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/d6/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/d6/JclVersionControlExpert.res create mode 100644 official/1.100/packages/d6/JclVersionControlExpertDLL.dof create mode 100644 official/1.100/packages/d6/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d6/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d6/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/d6/dirinfo.txt create mode 100644 official/1.100/packages/d6/template.dof create mode 100644 official/1.100/packages/d6/template.dpk create mode 100644 official/1.100/packages/d6/template.dpr create mode 100644 official/1.100/packages/d6/template.rc create mode 100644 official/1.100/packages/d7/Jcl.dof create mode 100644 official/1.100/packages/d7/Jcl.dpk create mode 100644 official/1.100/packages/d7/Jcl.rc create mode 100644 official/1.100/packages/d7/Jcl.res create mode 100644 official/1.100/packages/d7/JclBaseExpert.dof create mode 100644 official/1.100/packages/d7/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d7/JclBaseExpert.rc create mode 100644 official/1.100/packages/d7/JclBaseExpert.res create mode 100644 official/1.100/packages/d7/JclDebugExpert.dof create mode 100644 official/1.100/packages/d7/JclDebugExpert.dpk create mode 100644 official/1.100/packages/d7/JclDebugExpert.rc create mode 100644 official/1.100/packages/d7/JclDebugExpert.res create mode 100644 official/1.100/packages/d7/JclDebugExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclDebugExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclDebugExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpert.dof create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpert.res create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpert.RES create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpert.dof create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclRepositoryExpert.dof create mode 100644 official/1.100/packages/d7/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/d7/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/d7/JclRepositoryExpert.res create mode 100644 official/1.100/packages/d7/JclRepositoryExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclRepositoryExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclRepositoryExpertDLL.res create mode 100644 official/1.100/packages/d7/JclSIMDViewExpert.dof create mode 100644 official/1.100/packages/d7/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/d7/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/d7/JclSIMDViewExpert.res create mode 100644 official/1.100/packages/d7/JclSIMDViewExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclSIMDViewExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclSIMDViewExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclThreadNameExpert.dof create mode 100644 official/1.100/packages/d7/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/d7/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/d7/JclThreadNameExpert.res create mode 100644 official/1.100/packages/d7/JclThreadNameExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclThreadNameExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclThreadNameExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclUsesExpert.dof create mode 100644 official/1.100/packages/d7/JclUsesExpert.dpk create mode 100644 official/1.100/packages/d7/JclUsesExpert.rc create mode 100644 official/1.100/packages/d7/JclUsesExpert.res create mode 100644 official/1.100/packages/d7/JclUsesExpertDLL.RES create mode 100644 official/1.100/packages/d7/JclUsesExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclUsesExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclUsesExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclVClx.dof create mode 100644 official/1.100/packages/d7/JclVClx.dpk create mode 100644 official/1.100/packages/d7/JclVClx.rc create mode 100644 official/1.100/packages/d7/JclVClx.res create mode 100644 official/1.100/packages/d7/JclVcl.dof create mode 100644 official/1.100/packages/d7/JclVcl.dpk create mode 100644 official/1.100/packages/d7/JclVcl.rc create mode 100644 official/1.100/packages/d7/JclVcl.res create mode 100644 official/1.100/packages/d7/JclVersionControlExpert.dof create mode 100644 official/1.100/packages/d7/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/d7/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/d7/JclVersionControlExpert.res create mode 100644 official/1.100/packages/d7/JclVersionControlExpertDLL.dof create mode 100644 official/1.100/packages/d7/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d7/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d7/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/d7/dirinfo.txt create mode 100644 official/1.100/packages/d7/template.dof create mode 100644 official/1.100/packages/d7/template.dpk create mode 100644 official/1.100/packages/d7/template.dpr create mode 100644 official/1.100/packages/d7/template.rc create mode 100644 official/1.100/packages/d8/Jcl.RES create mode 100644 official/1.100/packages/d8/Jcl.bdsproj create mode 100644 official/1.100/packages/d8/Jcl.dpk create mode 100644 official/1.100/packages/d8/Jcl.rc create mode 100644 official/1.100/packages/d8/JclBaseExpert.RES create mode 100644 official/1.100/packages/d8/JclBaseExpert.bdsproj create mode 100644 official/1.100/packages/d8/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d8/JclBaseExpert.rc create mode 100644 official/1.100/packages/d8/JclFavoriteFoldersExpertDLL.RES create mode 100644 official/1.100/packages/d8/JclFavoriteFoldersExpertDLL.bdsproj create mode 100644 official/1.100/packages/d8/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d8/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d8/JclVersionControlExpertDLL.bdsproj create mode 100644 official/1.100/packages/d8/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d8/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d8/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/d8/template.bdsproj create mode 100644 official/1.100/packages/d8/template.dpk create mode 100644 official/1.100/packages/d8/template.dpr create mode 100644 official/1.100/packages/d8/template.rc create mode 100644 official/1.100/packages/d9.net/Jedi.Jcl.bdsproj create mode 100644 official/1.100/packages/d9.net/Jedi.Jcl.dpr create mode 100644 official/1.100/packages/d9.net/template.bdsproj create mode 100644 official/1.100/packages/d9.net/template.dpr create mode 100644 official/1.100/packages/d9/Jcl.RES create mode 100644 official/1.100/packages/d9/Jcl.bdsproj create mode 100644 official/1.100/packages/d9/Jcl.dpk create mode 100644 official/1.100/packages/d9/Jcl.rc create mode 100644 official/1.100/packages/d9/JclBaseExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclBaseExpert.dpk create mode 100644 official/1.100/packages/d9/JclBaseExpert.rc create mode 100644 official/1.100/packages/d9/JclBaseExpert.res create mode 100644 official/1.100/packages/d9/JclDebugExpert.RES create mode 100644 official/1.100/packages/d9/JclDebugExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclDebugExpert.dpk create mode 100644 official/1.100/packages/d9/JclDebugExpert.rc create mode 100644 official/1.100/packages/d9/JclDebugExpertDLL.RES create mode 100644 official/1.100/packages/d9/JclDebugExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclDebugExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclDebugExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclExperts.bdsgroup create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpert.dpk create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpert.rc create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpert.res create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpertDLL.RES create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclFavoriteFoldersExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpert.RES create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpert.dpk create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpert.rc create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpertDLL.RES create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclProjectAnalysisExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclRepositoryExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclRepositoryExpert.dpk create mode 100644 official/1.100/packages/d9/JclRepositoryExpert.rc create mode 100644 official/1.100/packages/d9/JclRepositoryExpert.res create mode 100644 official/1.100/packages/d9/JclRepositoryExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclRepositoryExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclRepositoryExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclRepositoryExpertDLL.res create mode 100644 official/1.100/packages/d9/JclSIMDViewExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclSIMDViewExpert.dpk create mode 100644 official/1.100/packages/d9/JclSIMDViewExpert.rc create mode 100644 official/1.100/packages/d9/JclSIMDViewExpertDLL.RES create mode 100644 official/1.100/packages/d9/JclSIMDViewExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclSIMDViewExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclSIMDViewExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclSimdViewExpert.RES create mode 100644 official/1.100/packages/d9/JclThreadNameExpert.RES create mode 100644 official/1.100/packages/d9/JclThreadNameExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclThreadNameExpert.dpk create mode 100644 official/1.100/packages/d9/JclThreadNameExpert.rc create mode 100644 official/1.100/packages/d9/JclThreadNameExpertDLL.RES create mode 100644 official/1.100/packages/d9/JclThreadNameExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclThreadNameExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclThreadNameExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclVcl.RES create mode 100644 official/1.100/packages/d9/JclVcl.bdsproj create mode 100644 official/1.100/packages/d9/JclVcl.dpk create mode 100644 official/1.100/packages/d9/JclVcl.rc create mode 100644 official/1.100/packages/d9/JclVersionControlExpert.bdsproj create mode 100644 official/1.100/packages/d9/JclVersionControlExpert.dpk create mode 100644 official/1.100/packages/d9/JclVersionControlExpert.rc create mode 100644 official/1.100/packages/d9/JclVersionControlExpert.res create mode 100644 official/1.100/packages/d9/JclVersionControlExpertDLL.bdsproj create mode 100644 official/1.100/packages/d9/JclVersionControlExpertDLL.dpr create mode 100644 official/1.100/packages/d9/JclVersionControlExpertDLL.rc create mode 100644 official/1.100/packages/d9/JclVersionControlExpertDLL.res create mode 100644 official/1.100/packages/d9/template.bdsproj create mode 100644 official/1.100/packages/d9/template.dpk create mode 100644 official/1.100/packages/d9/template.dpr create mode 100644 official/1.100/packages/d9/template.rc create mode 100644 official/1.100/packages/dirinfo.txt create mode 100644 official/1.100/packages/k3/Jcl.bpf create mode 100644 official/1.100/packages/k3/Jcl.bpk create mode 100644 official/1.100/packages/k3/Jcl.dpk create mode 100644 official/1.100/packages/k3/Jcl.kof create mode 100644 official/1.100/packages/k3/Jcl.rc create mode 100644 official/1.100/packages/k3/Jcl.res create mode 100644 official/1.100/packages/k3/JclVClx.bpf create mode 100644 official/1.100/packages/k3/JclVClx.bpk create mode 100644 official/1.100/packages/k3/JclVClx.dpk create mode 100644 official/1.100/packages/k3/JclVClx.kof create mode 100644 official/1.100/packages/k3/JclVClx.rc create mode 100644 official/1.100/packages/k3/JclVClx.res create mode 100644 official/1.100/packages/k3/dirinfo.txt create mode 100644 official/1.100/packages/k3/template.bpf create mode 100644 official/1.100/packages/k3/template.bpk create mode 100644 official/1.100/packages/k3/template.dpk create mode 100644 official/1.100/packages/k3/template.kof create mode 100644 official/1.100/packages/k3/template.rc create mode 100644 official/1.100/packages/resources.mak create mode 100644 official/1.100/packages/xml/Jcl-L.xml create mode 100644 official/1.100/packages/xml/Jcl-R.xml create mode 100644 official/1.100/packages/xml/JclBaseExpert-D.xml create mode 100644 official/1.100/packages/xml/JclDebugExpert-D.xml create mode 100644 official/1.100/packages/xml/JclDebugExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclFavoriteFoldersExpert-D.xml create mode 100644 official/1.100/packages/xml/JclFavoriteFoldersExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclProjectAnalysisExpert-D.xml create mode 100644 official/1.100/packages/xml/JclProjectAnalysisExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclRepositoryExpert-D.xml create mode 100644 official/1.100/packages/xml/JclRepositoryExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclSIMDViewExpert-D.xml create mode 100644 official/1.100/packages/xml/JclSIMDViewExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclThreadNameExpert-D.xml create mode 100644 official/1.100/packages/xml/JclThreadNameExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclUsesExpert-D.xml create mode 100644 official/1.100/packages/xml/JclUsesExpertDLL-L.xml create mode 100644 official/1.100/packages/xml/JclVClx-R.xml create mode 100644 official/1.100/packages/xml/JclVcl-R.xml create mode 100644 official/1.100/packages/xml/JclVersionControlExpert-D.xml create mode 100644 official/1.100/packages/xml/JclVersionControlExpertDLL-L.xml create mode 100644 official/1.100/source/Makefile.fpc create mode 100644 official/1.100/source/common/Jcl8087.pas create mode 100644 official/1.100/source/common/JclAbstractContainers.pas create mode 100644 official/1.100/source/common/JclAlgorithms.pas create mode 100644 official/1.100/source/common/JclAnsiStrings.pas create mode 100644 official/1.100/source/common/JclArrayLists.pas create mode 100644 official/1.100/source/common/JclArraySets.pas create mode 100644 official/1.100/source/common/JclBase.pas create mode 100644 official/1.100/source/common/JclBinaryTrees.pas create mode 100644 official/1.100/source/common/JclBorlandTools.pas create mode 100644 official/1.100/source/common/JclComplex.pas create mode 100644 official/1.100/source/common/JclCompression.pas create mode 100644 official/1.100/source/common/JclContainerIntf.pas create mode 100644 official/1.100/source/common/JclCounter.pas create mode 100644 official/1.100/source/common/JclDITs-1.92.int create mode 100644 official/1.100/source/common/JclDateTime.pas create mode 100644 official/1.100/source/common/JclEDI.pas create mode 100644 official/1.100/source/common/JclEDISEF.pas create mode 100644 official/1.100/source/common/JclEDITranslators.pas create mode 100644 official/1.100/source/common/JclEDIXML.pas create mode 100644 official/1.100/source/common/JclEDI_ANSIX12.pas create mode 100644 official/1.100/source/common/JclEDI_ANSIX12_Ext.pas create mode 100644 official/1.100/source/common/JclEDI_UNEDIFACT.pas create mode 100644 official/1.100/source/common/JclEDI_UNEDIFACT_Ext.pas create mode 100644 official/1.100/source/common/JclExprEval.pas create mode 100644 official/1.100/source/common/JclFileUtils.pas create mode 100644 official/1.100/source/common/JclHashMaps.pas create mode 100644 official/1.100/source/common/JclHashSets.pas create mode 100644 official/1.100/source/common/JclIniFiles-1.92.int create mode 100644 official/1.100/source/common/JclIniFiles.pas create mode 100644 official/1.100/source/common/JclLinkedLists.pas create mode 100644 official/1.100/source/common/JclLogic.pas create mode 100644 official/1.100/source/common/JclMIDI.pas create mode 100644 official/1.100/source/common/JclMath.pas create mode 100644 official/1.100/source/common/JclMime.pas create mode 100644 official/1.100/source/common/JclPCRE.pas create mode 100644 official/1.100/source/common/JclQueues.pas create mode 100644 official/1.100/source/common/JclRTTI.pas create mode 100644 official/1.100/source/common/JclResources.pas create mode 100644 official/1.100/source/common/JclSchedule.pas create mode 100644 official/1.100/source/common/JclSimpleXml.pas create mode 100644 official/1.100/source/common/JclStacks.pas create mode 100644 official/1.100/source/common/JclStatistics.pas create mode 100644 official/1.100/source/common/JclStrHashMap.pas create mode 100644 official/1.100/source/common/JclStreams.pas create mode 100644 official/1.100/source/common/JclStringLists.pas create mode 100644 official/1.100/source/common/JclStrings.pas create mode 100644 official/1.100/source/common/JclSysInfo.fpc create mode 100644 official/1.100/source/common/JclSysInfo.pas create mode 100644 official/1.100/source/common/JclSysUtils.pas create mode 100644 official/1.100/source/common/JclUnitConv.pas create mode 100644 official/1.100/source/common/JclUnitVersioning.pas create mode 100644 official/1.100/source/common/JclUnitVersioningProviders.pas create mode 100644 official/1.100/source/common/JclValidation.pas create mode 100644 official/1.100/source/common/JclVectors.pas create mode 100644 official/1.100/source/common/JclWideStrings.pas create mode 100644 official/1.100/source/common/JclZLib.int create mode 100644 official/1.100/source/common/bzip2.pas create mode 100644 official/1.100/source/common/dirinfo.txt create mode 100644 official/1.100/source/common/pcre.pas create mode 100644 official/1.100/source/crossplatform.inc create mode 100644 official/1.100/source/fpctest.bat create mode 100644 official/1.100/source/fpctestunit.bat create mode 100644 official/1.100/source/jcl.inc create mode 100644 official/1.100/source/jcl.template.inc create mode 100644 official/1.100/source/jclc5.inc create mode 100644 official/1.100/source/jclc6.inc create mode 100644 official/1.100/source/jclcs1.inc create mode 100644 official/1.100/source/jcld10.inc create mode 100644 official/1.100/source/jcld10.net.inc create mode 100644 official/1.100/source/jcld11.inc create mode 100644 official/1.100/source/jcld5.inc create mode 100644 official/1.100/source/jcld6.inc create mode 100644 official/1.100/source/jcld7.inc create mode 100644 official/1.100/source/jcld8.inc create mode 100644 official/1.100/source/jcld9.inc create mode 100644 official/1.100/source/jcld9.net.inc create mode 100644 official/1.100/source/jclkc3.inc create mode 100644 official/1.100/source/jclkd3.inc create mode 100644 official/1.100/source/jedi.inc create mode 100644 official/1.100/source/kylix.inc create mode 100644 official/1.100/source/prototypes/Hardlinks.pas create mode 100644 official/1.100/source/prototypes/JclGraphUtils.pas create mode 100644 official/1.100/source/prototypes/JclGraphics.pas create mode 100644 official/1.100/source/prototypes/JclQGraphUtils.pas create mode 100644 official/1.100/source/prototypes/JclQGraphics.pas create mode 100644 official/1.100/source/prototypes/JclWin32.pas create mode 100644 official/1.100/source/prototypes/Makefile.mak create mode 100644 official/1.100/source/prototypes/_GraphUtils.pas create mode 100644 official/1.100/source/prototypes/_Graphics.pas create mode 100644 official/1.100/source/prototypes/supplement/create_JCL_Hardlinks.pas.cmd create mode 100644 official/1.100/source/prototypes/supplement/create_nonJCL_Hardlinks.pas.cmd create mode 100644 official/1.100/source/prototypes/supplement/simple_pp.pl create mode 100644 official/1.100/source/prototypes/win32api/AclApi.imp create mode 100644 official/1.100/source/prototypes/win32api/AclApi.int create mode 100644 official/1.100/source/prototypes/win32api/BaseTsd.int create mode 100644 official/1.100/source/prototypes/win32api/DelayImp.int create mode 100644 official/1.100/source/prototypes/win32api/ImageHlp.imp create mode 100644 official/1.100/source/prototypes/win32api/ImageHlp.int create mode 100644 official/1.100/source/prototypes/win32api/ImgGuids.int create mode 100644 official/1.100/source/prototypes/win32api/LmAccess.imp create mode 100644 official/1.100/source/prototypes/win32api/LmAccess.int create mode 100644 official/1.100/source/prototypes/win32api/LmApiBuf.imp create mode 100644 official/1.100/source/prototypes/win32api/LmApiBuf.int create mode 100644 official/1.100/source/prototypes/win32api/LmCons.int create mode 100644 official/1.100/source/prototypes/win32api/LmErr.int create mode 100644 official/1.100/source/prototypes/win32api/MsiDefs.int create mode 100644 official/1.100/source/prototypes/win32api/NTDef.int create mode 100644 official/1.100/source/prototypes/win32api/Nb30.imp create mode 100644 official/1.100/source/prototypes/win32api/Nb30.int create mode 100644 official/1.100/source/prototypes/win32api/ObjBase.imp create mode 100644 official/1.100/source/prototypes/win32api/ObjBase.int create mode 100644 official/1.100/source/prototypes/win32api/PropIdl.int create mode 100644 official/1.100/source/prototypes/win32api/RasDlg.int create mode 100644 official/1.100/source/prototypes/win32api/Reason.int create mode 100644 official/1.100/source/prototypes/win32api/ShlGuid.int create mode 100644 official/1.100/source/prototypes/win32api/ShlObj.int create mode 100644 official/1.100/source/prototypes/win32api/ShlWApi.int create mode 100644 official/1.100/source/prototypes/win32api/WinBase.imp create mode 100644 official/1.100/source/prototypes/win32api/WinBase.int create mode 100644 official/1.100/source/prototypes/win32api/WinDef.int create mode 100644 official/1.100/source/prototypes/win32api/WinError.int create mode 100644 official/1.100/source/prototypes/win32api/WinIoctl.int create mode 100644 official/1.100/source/prototypes/win32api/WinNLS.imp create mode 100644 official/1.100/source/prototypes/win32api/WinNLS.int create mode 100644 official/1.100/source/prototypes/win32api/WinNT.imp create mode 100644 official/1.100/source/prototypes/win32api/WinNT.int create mode 100644 official/1.100/source/prototypes/win32api/WinUser.int create mode 100644 official/1.100/source/prototypes/win32api/dirinfo.txt create mode 100644 official/1.100/source/prototypes/win32api/fpc.inc create mode 100644 official/1.100/source/prototypes/win32api/powrprof.imp create mode 100644 official/1.100/source/prototypes/win32api/powrprof.int create mode 100644 official/1.100/source/prototypes/zlibh.pas create mode 100644 official/1.100/source/unix/dirinfo.txt create mode 100644 official/1.100/source/unix/zlibh.pas create mode 100644 official/1.100/source/unixonly.inc create mode 100644 official/1.100/source/vcl/JclGraphUtils.pas create mode 100644 official/1.100/source/vcl/JclGraphics.pas create mode 100644 official/1.100/source/vcl/JclPrint.pas create mode 100644 official/1.100/source/vcl/dirinfo.txt create mode 100644 official/1.100/source/visclx/JclQGraphUtils.pas create mode 100644 official/1.100/source/visclx/JclQGraphics.pas create mode 100644 official/1.100/source/visclx/dirinfo.txt create mode 100644 official/1.100/source/windows/Hardlinks.pas create mode 100644 official/1.100/source/windows/JclAppInst.pas create mode 100644 official/1.100/source/windows/JclCIL.pas create mode 100644 official/1.100/source/windows/JclCLR.pas create mode 100644 official/1.100/source/windows/JclCOM.pas create mode 100644 official/1.100/source/windows/JclCommCtrlAdmin.manifest create mode 100644 official/1.100/source/windows/JclCommCtrlAdmin.rc create mode 100644 official/1.100/source/windows/JclCommCtrlAdmin.res create mode 100644 official/1.100/source/windows/JclCommCtrlAsInvoker.manifest create mode 100644 official/1.100/source/windows/JclCommCtrlAsInvoker.rc create mode 100644 official/1.100/source/windows/JclCommCtrlAsInvoker.res create mode 100644 official/1.100/source/windows/JclConsole.pas create mode 100644 official/1.100/source/windows/JclDebug.pas create mode 100644 official/1.100/source/windows/JclDotNet.pas create mode 100644 official/1.100/source/windows/JclHookExcept.pas create mode 100644 official/1.100/source/windows/JclLANMan.pas create mode 100644 official/1.100/source/windows/JclLocales.pas create mode 100644 official/1.100/source/windows/JclMapi.pas create mode 100644 official/1.100/source/windows/JclMetadata.pas create mode 100644 official/1.100/source/windows/JclMiscel.pas create mode 100644 official/1.100/source/windows/JclMsdosSys.pas create mode 100644 official/1.100/source/windows/JclMultimedia.pas create mode 100644 official/1.100/source/windows/JclNTFS.pas create mode 100644 official/1.100/source/windows/JclNoDepAdmin.manifest create mode 100644 official/1.100/source/windows/JclNoDepAdmin.rc create mode 100644 official/1.100/source/windows/JclNoDepAdmin.res create mode 100644 official/1.100/source/windows/JclNoDepAsInvoker.manifest create mode 100644 official/1.100/source/windows/JclNoDepAsInvoker.rc create mode 100644 official/1.100/source/windows/JclNoDepAsInvoker.res create mode 100644 official/1.100/source/windows/JclPeImage.pas create mode 100644 official/1.100/source/windows/JclRegistry.pas create mode 100644 official/1.100/source/windows/JclSecurity.pas create mode 100644 official/1.100/source/windows/JclShell.pas create mode 100644 official/1.100/source/windows/JclStructStorage.pas create mode 100644 official/1.100/source/windows/JclSvcCtrl.pas create mode 100644 official/1.100/source/windows/JclSynch.pas create mode 100644 official/1.100/source/windows/JclTD32.pas create mode 100644 official/1.100/source/windows/JclTask.pas create mode 100644 official/1.100/source/windows/JclUnicode.pas create mode 100644 official/1.100/source/windows/JclUnicode.rc create mode 100644 official/1.100/source/windows/JclUnicode.res create mode 100644 official/1.100/source/windows/JclWideFormat.pas create mode 100644 official/1.100/source/windows/JclWin32.pas create mode 100644 official/1.100/source/windows/JclWin32Ex.pas create mode 100644 official/1.100/source/windows/JclWinMIDI.pas create mode 100644 official/1.100/source/windows/MSHelpServices_TLB.pas create mode 100644 official/1.100/source/windows/MSTask.pas create mode 100644 official/1.100/source/windows/Snmp.pas create mode 100644 official/1.100/source/windows/dirinfo.txt create mode 100644 official/1.100/source/windows/mscoree_TLB.pas create mode 100644 official/1.100/source/windows/mscorlib_TLB.pas create mode 100644 official/1.100/source/windows/obj/bzip2/blocksort.obj create mode 100644 official/1.100/source/windows/obj/bzip2/bzlib.obj create mode 100644 official/1.100/source/windows/obj/bzip2/compress.obj create mode 100644 official/1.100/source/windows/obj/bzip2/crctable.obj create mode 100644 official/1.100/source/windows/obj/bzip2/decompress.obj create mode 100644 official/1.100/source/windows/obj/bzip2/dirinfo.txt create mode 100644 official/1.100/source/windows/obj/bzip2/huffman.obj create mode 100644 official/1.100/source/windows/obj/bzip2/makefile.mak create mode 100644 official/1.100/source/windows/obj/bzip2/randtable.obj create mode 100644 official/1.100/source/windows/obj/dirinfo.txt create mode 100644 official/1.100/source/windows/obj/pcre/dirinfo.txt create mode 100644 official/1.100/source/windows/obj/pcre/makefile.mak create mode 100644 official/1.100/source/windows/obj/pcre/pcre_compile.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_config.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_default_tables.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_dfa_exec.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_exec.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_fullinfo.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_get.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_globals.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_info.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_maketables.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_newline.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_ord2utf8.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_refcount.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_study.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_tables.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_try_flipped.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_ucp_searchfuncs.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_valid_utf8.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_version.obj create mode 100644 official/1.100/source/windows/obj/pcre/pcre_xclass.obj create mode 100644 official/1.100/source/windows/obj/zlib/adler32.obj create mode 100644 official/1.100/source/windows/obj/zlib/compress.obj create mode 100644 official/1.100/source/windows/obj/zlib/crc32.obj create mode 100644 official/1.100/source/windows/obj/zlib/deflate.obj create mode 100644 official/1.100/source/windows/obj/zlib/dirinfo.txt create mode 100644 official/1.100/source/windows/obj/zlib/gzio.obj create mode 100644 official/1.100/source/windows/obj/zlib/infback.obj create mode 100644 official/1.100/source/windows/obj/zlib/inffast.obj create mode 100644 official/1.100/source/windows/obj/zlib/inflate.obj create mode 100644 official/1.100/source/windows/obj/zlib/inftrees.obj create mode 100644 official/1.100/source/windows/obj/zlib/makefile.mak create mode 100644 official/1.100/source/windows/obj/zlib/trees.obj create mode 100644 official/1.100/source/windows/obj/zlib/uncompr.obj create mode 100644 official/1.100/source/windows/obj/zlib/zutil.obj create mode 100644 official/1.100/source/windows/zlibh.pas create mode 100644 official/1.100/source/windowsonly.inc diff --git a/official/1.100/Install.bat b/official/1.100/Install.bat new file mode 100644 index 0000000..f987288 --- /dev/null +++ b/official/1.100/Install.bat @@ -0,0 +1,24 @@ +@echo off + +cd install\build +call pretest.bat +if ERRORLEVEL 1 GOTO FINI + +SET DELPHIVERSION=%1 +if "%1" == "" SET DELPHIVERSION=newest + +build.exe %DELPHIVERSION% "--make=installer" +if ERRORLEVEL 1 GOTO FINI + +echo Launching JCL installer ... + +start ..\..\bin\JediInstaller.exe +if ERRORLEVEL 1 goto FailStart +goto FINI + +:FailStart +..\..\bin\JediInstaller.exe +goto FINI + +:FINI +cd ..\.. diff --git a/official/1.100/Install.txt b/official/1.100/Install.txt new file mode 100644 index 0000000..44b3cb2 --- /dev/null +++ b/official/1.100/Install.txt @@ -0,0 +1,72 @@ +JEDI Code Library v 1.100 Installation + +Supported development tools versions: + +- Borland C++ Builder 5 +- Borland C++ Builder 6 +- Borland Delphi 5 Update Pack #1 +- Borland Delphi 6 Update Pack #2 (including Personal Edition) +- Borland Delphi 7 +- Borland Kylix 3 +- Borland Delphi 2005 +- Borland Developer Studio 2006 (also known as Delphi 2006, C++Builder 2006) +- CodeGear Delphi 2007 +- CodeGear C++Builder 2007 + +For more detailed information, see docs\Readme.html. + +Please make sure you have installed latest update packs. You can download them +from Borland Support web page: + +Delphi: http://info.borland.com/devsupport/delphi/ +C++Builder: http://info.borland.com/devsupport/bcppbuilder/ + +******************************* IMPORTANT ************************************** +* * +* If you have installed any previous version of the JCL/JVCL you have to * +* delete them. * +* * +* * +* It is also necessary to remove all installed JCL/JVCL packages from the IDE. * +* Do not mix files or compiled packages from older versions of the JCL with * +* current version. * +* * +* JCL 1.96 is not compatible with JVCL versions < 3 and _will_ break them! * +* JVCL v. 3.1 will get released together with JCL 1.96; it is available from * +* http://jvcl.sourceforge.net/daily/ * +* * +******************************************************************************** + +JEDI INSTALLER +============== + +Helps you to integrate JCL with Delphi/BCB IDE. Currently it assists with: + +- Compiling library units (release and debug versions) +- Compiling packages and installing design-time packages to the IDE +- Adding sample JCL Debug extension dialogs to Object Repository +- Adding JCL directories to Library Path / Browsing Path in Environment Options +- Adding JCL debug .dcu directory to Debug DCU Path in Debugger Options +- Integrating JCL help file to the IDE. +- in undoing above changes to the IDE settings ("Uninstall", new in 1.94 final). + +To execute for + +1) Win32 +- click on "Install.bat" file in the JCL root directory. + + Note: If you have Delphi 8 for Microsoft .NET installed, you probably will have + to specify the root directory of the make.exe to use for JCL installation; + on the commandline, type (for example): + + >install "C:\Program Files\Borland\Delphi5" + +2) Kylix 3 +- open a shell window +- cd into JCL root directory +- at the command prompt, type "sh ./install.sh", then press "Enter". + You'll also need to do a "source kylixpath" first (see the README of your + Kylix 3 installation) in case your system is not set up to do that at startup. + +-------------------------------- +Document last updated 2007-02-20 diff --git a/official/1.100/InstallForDelphi.bat b/official/1.100/InstallForDelphi.bat new file mode 100644 index 0000000..884190f --- /dev/null +++ b/official/1.100/InstallForDelphi.bat @@ -0,0 +1,38 @@ +@echo off + +cd install + +::jpp prototypes + +..\devtools\jpp.exe -c -dVCL -dMSWINDOWS -uVisualCLX -uUnix -uKYLIX -xVclGui\ prototypes\JediGUIMain.pas +if ERRORLEVEL 1 goto FailedCompile +..\devtools\jpp.exe -c -dVCL -dMSWINDOWS -uVisualCLX -uUnix -uKYLIX -xVclGui\ prototypes\JediGUIReadme.pas +if ERRORLEVEL 1 goto FailedCompile +..\devtools\jpp.exe -c -dVCL -dMSWINDOWS -uVisualCLX -uUnix -uKYLIX -xVclGui\ prototypes\JediGUIInstall.pas +if ERRORLEVEL 1 goto FailedCompile + + +:: compile installer + +build\dcc32ex.exe -q -w -dJCLINSTALL -E..\bin -I..\source -U..\source\common;..\source\windows JediInstaller.dpr %1 %2 %3 %4 %5 %6 %7 %8 +if ERRORLEVEL 1 goto FailedCompile + + +echo Launching JCL installer... + +start ..\bin\JediInstaller.exe +if ERRORLEVEL 1 goto FailStart +goto FINI + +:FailStart +..\bin\JediInstaller.exe +goto FINI + +:FailedCompile +echo. +echo. +echo An error occured while compiling the installer. Installation aborted. +echo. + +:FINI +cd .. diff --git a/official/1.100/QInstall.bat b/official/1.100/QInstall.bat new file mode 100644 index 0000000..ffd17cd --- /dev/null +++ b/official/1.100/QInstall.bat @@ -0,0 +1,13 @@ +@echo off + +cd install\build +call pretest.bat +if ERRORLEVEL 1 GOTO FINI + +SET DELPHIVERSION=%1 +if "%1" == "" SET DELPHIVERSION=d7 + +build.exe %DELPHIVERSION% "--make=qinstaller" + +:FINI +cd ..\.. diff --git a/official/1.100/bin/dirinfo.txt b/official/1.100/bin/dirinfo.txt new file mode 100644 index 0000000..38bc9b2 --- /dev/null +++ b/official/1.100/bin/dirinfo.txt @@ -0,0 +1 @@ +This directory is intended as a common place for sample application's EXE files \ No newline at end of file diff --git a/official/1.100/clean.bat b/official/1.100/clean.bat new file mode 100644 index 0000000..b9af953 --- /dev/null +++ b/official/1.100/clean.bat @@ -0,0 +1,16 @@ +@echo cleaning... +@REM do not delete precompiled installer +@for %%f in (bin\*.exe) do @if not %%f==bin\JediInstaller.exe if not %%f==bin\QJediInstaller.exe (del %%f) +@del /f /s *.~* *.bk bin\*.dll *.a *.bpi *.dcp *.dcu *.dpu *.hpp *.jdbg *.map *.o +@cd lib +@del /f /s *.obj *.res *.lib *.bpi +@cd .. +@cd examples +@del /f /s *.cfg +@cd .. +@cd experts +@del /f /s *.cfg +@cd .. +@cd packages +@del /f /s *.cfg *.local *.identcache *.rsp +@cd.. \ No newline at end of file diff --git a/official/1.100/clean.sh b/official/1.100/clean.sh new file mode 100644 index 0000000..a74b87f --- /dev/null +++ b/official/1.100/clean.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +rm -f `find -name \*~` +rm -f `find -name *.~*` +rm -f `find -name *.a` +rm -f `find -name *.bpi` +rm -f `find -name *.dcp` +rm -f `find -name *.dcu` +rm -f `find -name *.dpu` +rm -f `find -name *.hpp` +rm -f `find -name *.o` +rm -f packages/k?/*.mak \ No newline at end of file diff --git a/official/1.100/devtools/included_files.bat b/official/1.100/devtools/included_files.bat new file mode 100644 index 0000000..0253dcd --- /dev/null +++ b/official/1.100/devtools/included_files.bat @@ -0,0 +1,16 @@ +rem shell script to create templates + +copy ..\source\jcl.template.inc ..\source\jclc5.inc +copy ..\source\jcl.template.inc ..\source\jclc6.inc +copy ..\source\jcl.template.inc ..\source\jclkc3.inc +copy ..\source\jcl.template.inc ..\source\jclkd3.inc +copy ..\source\jcl.template.inc ..\source\jcld5.inc +copy ..\source\jcl.template.inc ..\source\jcld6.inc +copy ..\source\jcl.template.inc ..\source\jcld7.inc +copy ..\source\jcl.template.inc ..\source\jclcs1.inc +copy ..\source\jcl.template.inc ..\source\jcld8.inc +copy ..\source\jcl.template.inc ..\source\jcld9.inc +copy ..\source\jcl.template.inc ..\source\jcld9.net.inc +copy ..\source\jcl.template.inc ..\source\jcld10.inc +copy ..\source\jcl.template.inc ..\source\jcld10.net.inc +copy ..\source\jcl.template.inc ..\source\jcld11.inc \ No newline at end of file diff --git a/official/1.100/devtools/included_files.sh b/official/1.100/devtools/included_files.sh new file mode 100644 index 0000000..4e63013 --- /dev/null +++ b/official/1.100/devtools/included_files.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# +# shell script to create templates + +cp ../source/jcl.template.inc ../source/jclc5.inc +cp ../source/jcl.template.inc ../source/jclc6.inc +cp ../source/jcl.template.inc ../source/jclkc3.inc +cp ../source/jcl.template.inc ../source/jclkd3.inc +cp ../source/jcl.template.inc ../source/jcld5.inc +cp ../source/jcl.template.inc ../source/jcld6.inc +cp ../source/jcl.template.inc ../source/jcld7.inc +cp ../source/jcl.template.inc ../source/jclcs1.inc +cp ../source/jcl.template.inc ../source/jcld8.inc +cp ../source/jcl.template.inc ../source/jcld9.inc +cp ../source/jcl.template.inc ../source/jcld9.net.inc +cp ../source/jcl.template.inc ../source/jcld10.inc +cp ../source/jcl.template.inc ../source/jcld10.net.inc +cp ../source/jcl.template.inc ../source/jcld11.inc \ No newline at end of file diff --git a/official/1.100/devtools/jpp b/official/1.100/devtools/jpp new file mode 100644 index 0000000000000000000000000000000000000000..a799c82347a536edb8dfc860296ef09300f6707d GIT binary patch literal 185212 zcmcG%3w#q*`ae8Lre!FR1PoB2YQ%ydC@lpAS~Qdf3vvl9g;KdgYrz8Db^=ukO-<`| zI(E0Z=(?-B3+v_QdfBb6tM#%P8f*bCTP{kus1;Es2DL&L0#x&UpEHwW3he*4pZ9(L z#mPC}b3e~{&U2pgoHJvUbM_2_!N5iSjGT!h)O~%NFahp_b|Z_Lz}dMtZWK3&vvKhh zPLGEd=-CcGJ#lz=JSIE`=|LPlSHe#Z#ZlSO+7QR#vH!-%*?%*T<>#zwJPW&ih+xN) zlEHBf7su+Qcxut^kBr>zWkUpd>VWB?c2OPUO4hC#SF+}&lC>M$6*re}ym>qVFZ!c4 zcz%oe@i!1pKRl&6Yyn=O!-IicI(#j#Lx*nwPSN3;f$cg>^x||l9kA=MSpCz0J9Ri4 zxLt?m0sC}#A#jrpF9mk!a1pRwhc^IQbyx)EbohS2u190-@c?(~@PokZI{XN*Plq1| zZqnhWfVb=L-+&u+*az&<;rD?{b@*f86*_zr*s7ynC$LKw{}r%9hra_((cx3Tb{#$k zY}H|6$`lF^lfMqPbrz#bi*3|y+i z(|}j#a5k_@hvxxr*Wo3=DUZk6yMf|$^eYE$)ZzPpJ9W4kxLt=OV4n{E8n{V^9|N}Q z>U$p8s>AO9b2_{axJ#G+GvM|oV(sk)_UUk6O!_7rP6FPp!>PcHIy@QJqr;iNr8+zd zc!dt<0K0U!0NA0!tASH=_#R-p4wnO4b@+Z@PKUj~UB8d@PX_MPVTeGkU5B3l-mb$> z12^jMi@+WoZU!#ZVL$K+9sUs5rNak+9XfmjI7Np)2e#|**T7aC{t1}VVF5zF>vysK zS%Eusco=ZI4qp%K)8SFTO*%Xdc)Jcy25!{hEMSig&jK#h;d#I-ba)Z4ONW;NJ9M}Z zI7Nro1KV|Y6R=f>J;0m}*8z9w`1@htP91&>xLt>z1or6gv%sY~`~vU_9sUQfONZYC zcIa>`uuq3Oftz&rEbw+69)N|iQHPU(eY)`+1Kgy;X~3O2elDT-fA9jWxdS zc!7rNfSYykzXkT`@Uy_Xb@&zF*~xLy^16Vx^~AIFc>wogn1gbW^-~O6fopV_D=!pF zHm+V-Qpl}wmvTi#CGPTKZc|Zd+1d?a5f^n=muxIAkHSTT&}Ee~ zX}MYl^J^ijh7BdlOIB{Ud+mmzjVP$FtZc)^<hH?&YXW?Zu|TvT`E$=GEn^HOMH($c~* zcp`4e#?8QM%U5Bz?txpeX6@ae{@QXi!P@fj(v@h`+VWD26NN`IMAEI^fYCts%97IJ zmE7iyWosD0$WvHR%IO(_7@(w(*ha^}>lrg?W68225e@wE<*UVeOAA?V)~{N=+Fge6 zsGz~8ZV~gqyFqi=C@(K#tVKO7U0Yg6oKd=VjgH3(-D}sZT)n!myj;&N7;?sYDsL2l z&&AcnQT9iyHV?ofYu1*b5*lv!R6ZjQ8~-9uqJ%47dpDBNM7n1!+CdN#5M#hNn^Ay# zD5clntrW#FFrY|1zD&&84H%P4GhCiISmKK~HIi4)h+uRrnDz}R9PpYFbqhgrfPA-b zj;vL8J1bVt-6*atx>rS;R+h{tTM3!M;(+F?EV~Cx6oE)ySSrTghBcgPV;K>l+&+C{ z>AhuZ?=BYYqgIc$r%s-fHgB60J|vO***E8SS8$_q#Cz2(#? zM^0gRE~arWETUpveD+F+Li|m~vz0vf+l;3a&qf0HtHiSsj~Pz|9?IaxL;H+7@zDNY z8lF5n^hf)NEAU`z#{Nq1yBrV6|0#G@;Gw@;@N8l}j++U03!Z!NEY`xVfjbdTIi6K` zZo@-=cjGC;!}cj~hvWGLo+WtbkM>U&|0N@U_DT2Q!FG|OJ)La^#A$W%2>5nJ!H#OpcI}1-H z9^#|Xc%Y)Qef{-tQ}EEA6Hhktaa=CkEIf1ZB;uKm$B1VHo{@OyZxWu#cgI01;h>cu3`a>>=pF}R0*iJ46Ety;paTK{2(6QuV z&{D_+5hjoeLQf(WgPuVy7{x&@I-Nx>j3wFRf>CFa3&wJhi-B4|E|@8wTuh230~OlWXF*=g7rizep|^rHNcjz*oryvow>7iT^gaU``*o zV8UJGVla1;3&!|>Trf#HxnPWgOw&c~ zFJRXqw-n<~?naD1xf?M4up{*;#`u$aH^!gbB8)$|U@9xQU?3a0V8ldnS7H3gU5W80 zcLm0uTnNHZSG5+M{Vf@Km zfbl066DyzG9E?A?m{=>wbz%I;orm!!7Zb09+&LJ3axp_HX(V?B#-Cg##-H3Qj6b>4G5+LcV*JUShVduYf$=97LZ*pa2=`aX zg-~fGHv{8OZaT)F+$k7;az%`X_7|Smg&7(i(T!gU3Xh}KxY_#BWMN}Q(T~( zVGbi&jG4j(d<^r1G4r@U6T<>wJK^mNn+cC1+{mz%FgTP8co?=31_yG1Qic-=I|#2} zIEipJVHd-8!WaoI;9xkJFh-UOq%b^+@Cw3qhQ|`74h5_Xrw}eB%rQKHa0TJ6pAj%( z5@8SFPKGlG*AZ@K*g?3Fu#e#^!jBVfVmO=dcEZ~ko=x~U!i@~O2saV-FuZ_pGvQK( z^9lP1uV8oy;oXE?46h*EPT0Zl8p0ifQy4BL+)3EZa0y|Bu$AFb!d-+phDE|5!d*X6 z|0@X7+7swxxRS6yxSe4SVJl%D!!?8x2{$oZN7znyJHrnV9!0p3;YPwKggp#zBRq+4 zDZ`Hwb`V~{@RNke92amgyq&O%u!G^J3Fi||VfZ=1D+t>eevxo7VJpK;gi8r?48Kaa zf^b(4^}m_0hj1suZxgN~+|IC%a3f(K!@CGSPPmET-GsLj-p=p`gr6ha$Z$L1Cc++u z4-#%BT*`0jL#ZM40r5KqtdJgayLw40Dhm#a6;ThIzt?gqs)^2-^v7XV^@56yZjOt%Oqu zdl!!E*2 zggp!|Alyv2l;M2BKEf*)UP5>`VHd+I2)7exRh`g zVUA&uaENf%IX3?ZlWrX7WVn(rnI8k~40{NZ`7z*QxQ1{d;U3Ly&TL#ozt> z!#heN%J=Rv|D2WFEpz@*LdY0ONVE$5C)l{gT)9J^v@n)bO1#UDl>H;A1!G2%aoU@h zpxh%}mYqh2Ur0>kxdsRKCYl>&VcF5JW(N-Rl#dYM7X}aJxnk&yT6+?SJHjb)52H ztTVMfOU)x7-c#m646qO-WAWQ+(m%(NK4rZq$uTual`e^JQIe3FWQi_`?V=>sKe0AV z)+I?q62G2t#NIq&o%~0}DDIJM%f*&>oSV8hO zY+k!z&GMYWyVsVBg=I5cvo~(M2ew*WT;7JVi(`A|C4;SMgdxLIuehv2nCaGDTIO^z z6_<-@bT%w8u$yw~EWs~7${HF=b3pSa{TKdgv^ldOe*Qz?(>(cP?!ra#Ir$WrWhxPe zbH^$1(0Yoo6Vzsf>=ay!7Uu3Cin+prD3y1Yow#}Vvb&bH@SN~l{TvDpB7$Bri3Wn( z6KPI*cXhS#$p*vs7o@CY0nC?`Y}Vy(07NY`6j~W@{GIWUuG$CM`wPZ(b}C0QCsP^H zg8!}ryGkIngk^U0-<6{*uI9Kl4-e^1@}nT1B#Tk73r4{>%0}%~ZjGiu0?sek?M${P z*CJeIIis>g>4&feQhgD_q0GLRX4&`n?1px~@`Hy$1%&zqmrE_#CrUwI1o7KiJo3Td}r*%mE2?6Ud&p;3Za7${sL7>jJ2@)i?y zW;4$v5!xLe=41!&4=kZXXp{Lyfm0434kC!B z7zofPP2Y-!3;J+rP%>ne(w7yX$@biZ#I>F;tGrY5mxFP|1o;!$A09-Y=BWD$rK$?_ ze%y?n1}&ZoLpLX+`Re`kkGoJ3`Q%TOXVArEY%MVg57CHkv+>itomH|eIq(O>MaR{Z zGhazTao%Psj$2%i?>6{TeQdwSIu4c@N(Bh2*ywgg?Vd{8J~OzUt*0bSMp+Gx6za_b6O7XubCp}RMhK~lfj4cx)JSB|7N=VT;}mqPk@_Va zl6Fr%yZK6S+|F~xiW^TqBklBlVLJWv@@4)8F}0_ma&iwv4ERZl@wS@0ZHVtd0ygg| zs9F!3ciyRu7)is{K0CB+seio_;ljZn;u!l?QEuPqzJDx#c<-QLvJ=DiyGM zMFw^*6}b=ti@BV!vMfI1zRkw5c6IIdp5zZ_BpR9 zcNgyu#S4>Y?Ik(jJt=&ik^Dq{fxjzWNT5P(RyEvwnKC}FOy;SS#YnHPQYc3j^cwF} z5$)wLF9wmPc|Xmdc`(rVg$WZdN7eon$+OIvo^GWdb1^J(5&1t|aLLncF4^Q#uKj_SDUm5`T~fJqhWiSZM;UpB zO{FxSR#Rv=6ShJ~2*syZiHewADO4{__xN}=jvaEjx%P}Zj^)zTxG++k@B3(V-cZ=x zM|t<(;V={mvoo_lMo0MjdsK$r7r=#w>z=mu(PZ5l_f$P;ekm?bnQnM(-SUO0A8wKOd zTAGE6^5l-RFe5D^7#rW4UOpsRio(0aLG*J?;FN*1v9{?+b|p~^blA!$JH=B+oha7866zC%lmWK zJy0XS&~C6?D3DCeNTYiHe#lZg7>MFuIdo=vyunfv53DPBopBvU3^w<>iwf-zX8#>l z1r&Gy4Xys(gWuXSTa0OE^x3(El-nB1?Qm1hO#4nHt7p0jP)e@Wml5&91|r22lCLXWS3oeT!$gkI?~RlGVSF1Q^AxFXyM!>xeKy@d6UU24uc^7JCyg}!0HQ6g6+hFW@?4bli zB)C)NidWWW8>Y-MxJS$th5Bsclvzgi&{Ps;%O)LmTPOYGHt!5rcLuFM#z{X#hf7!@ z%%yoQ7(cV4-;1QSx(}t@J3FmK(r#%Vt#y4*zaZ_SMezCM7-E6R4Xj~UEL~85N>Y8P zN8kP6gAdI0*Ua!-u#2I8aGnb{iK{#p#)!*37n13xLM-rH$QScG7gF3;vUC+deGNDe<=2?^=(-Y>^mbEf3{=mofR|h z8vR-Dj-TH{g5ZTz;CfWAB)X$|A*b4kb}9)xruF}N=<+)trD}XoMhE*{Ia)6Z@`Hj>i6sbI89CdW zo-J(o(v)qh8xVGw{h@(sHz6?84pJwRE5@>MS~y?sAlWPqYvq%#Xw6DCB*+J4{~NSU zC=ZZ8>hiopnuIh6X zv?-3o)DO)B563&|5@)(k7mRMNGpgcHxP^FWhK&(Vsi&_U-rW z445V#E;kAMf=!?@oX92<7vmLCUEi*1I|%-RRJKyW=9h^MdAcJZaW^ zF260eV)f2AFTT9Z@+Vu>Kk>>_erYnobgdR^EqCh{^s?}XMN_NGLrdj{HEsN z8_DPCwtxMPo5;64^)Ji6Od%it?w(=4nn1qyZhrgEFW(BEW7Cv-`h7M9K1JfMZ>zrz zzEv;27p!<`nuGJ)H{|t^hdQzxT;q!y##cP}%WMbt>Y{|(2N(b4P6xN+yAM7Z)^cF3 zV|$Iwv2y<6njFXOXRc~|pL;j|;hs}_RyiIUUhQ;LZtN*^{P7>9W1f5Iy+5pVeEjUc!ZWX}XgT0`%J#&2 zgJ1aj4^yXgJ{0imx#P{>JU8w6AzxRG*)jOFftmN@-7vY~Y-wj@X3Cz7FT;=J)PIxt ztIy8;;X-ih^Yf=aG;ZCJt9nN6e{1@tFF!andR$HQ$gKSdjYqi~p8iu~){y5zf3<%3 z-mddmi=S)?^m(%W)Eei((`SQU%)0NqqE`O!YdI&N#8JfrR5{?Gn(`&C~)HDid` zUHzbY)1K@(C;sO*lhY?Qzw%w~S4*e9w=`Y;<0A#ncI~kH7CiINtt;gMxnsmq>DceBH(EZK1k z3zZS}S+y+4b4+*~lyb_nAZC3#(9=LP2L&kK6CkJ6G(RI0k#`^!iyST(N2>a;*VjSi zvH1xbly_ICX1^Gx&=p(B*(2o<9HAn-gHWhldzKj?BSV(b zM&%A9t=YddP8kXhtPI!i99cMDF~~xAeou5CPwTEedH zJiQrB7%dA>!Q}DjDegqMj88A+p%j-1>803~$YtjAQnPra*9Qt8i;cv4Oc`U#G;{&M zSjXt4?v*iESHSjTVtvI{P2Ep686pH`1Cj|9v2oF3K_fFqP05(9UK!*_MP{s&*B9%e)fZvw-t(Uet z(ht?9tbB?l2Zt*^Lr=he+`*I~!uPmst$c`Z-N&^`IY~E3{`6 z+#B(f@wcwya?tBv9CYCTq7vz0&+=o7LmM3<*}-9}O(Gq}1$$x+Hj-*ugW^)tGNZ1* z_C#88!8ksdXr@b>94Qw`E-n}8*gvE4Gc+DnJEda(sP<%>Lm3abE5~DUPB%G2@|GTO@a^E?keDWCccjnja1W6k2jxYyOwf+0uOm~D zPldyxO|Cj7$0JW|*!`imRk+jr2KEG97*L7W1Y@H0Ax^myO;$c3`k|d@pbMHA#!K0V z7T*O!@nESXf3fl&5+GF0;gx0ZhL7hXxiQfC4NWxccLj)9@Zw0p_E=J+>;a&Jj6;C% zej>$}NDAdR3)KM?QhA`pWVkM=7-{k~<2Hz(Y@}kXjeULCbI=VDr4tOmFb;o!hWQ0`uRC8Eh@z$Tf|~u7n(I-9EWA?f!m5+6G(am3z{W~8 zTfrI{DhR^hS+u4q2T;Xp{fg9nGsl9vnA&^yesBgxQOdvxohJ0%2VeMYhUV*zOL?m>&wX+kTjh+ZeOA>$KjxVz%~V&kqvfq__$5|n#s5j9#n&0osDnZ)y33{bw=g>4w@j$W=*?S zeHsHhB0-u(u{2CPXS211)&U+yw4r)LThb4*NVi**_ZD&GJ4B^-Ye0BXtA=}~rT}x| zRXWS_x_D*8VKz<4a_+g`ZgiU|ai7+>Cz05I5QDqFXDR^>v*rX?17RE_|LvSOKprBs z!{R+eR>B`6!2N@FDp4CT%3NZoukb_sfG}2e0?H;WNSZDv{{-(*@tfkP!rSEOW^nSY z$`P!t@XHRna{F<}lw7l%X-&_>CKb_%x~997_Ze-N(VW_Z<~dOx?iRR5d#9EXztLF+ zd34#JQ7UCPxrAh5hXtmEa+iET8{B1qJWPh(R?jSz#&&DyCDL55u*2(OzIgch!zROY z5Yj{9u39I|dy2@eY(i61n*xsGh;^cSoL|QgJpv!2CTKi@IZ>dqmj$f7S1ONuiRC~M z@mmlcM1g*#3P5ge{u+fSGW`A!4l9N6OUxK+@6-~?=8M2u|8Do#7 zRp~Y>cvQAR&rfPYDWLGI(9B9}S9n&)o#1N73@PcKLCE_<<4L8QVP-n9^oe{Watv*Q zGNk3`&vFQqApse%`~K-%p^Zb|Y8tA{2j@n|n=Xi9^i`V=I~#^zvb`~L z9LK%+wvQK@xt&ly$D>4@{eEGtvIHEWosZV~s_eQ*Qu&mrv1q!2NXLrUpy6*4z_{X# z>kG%Na<45}Q&^_D%Nu)Q&qsZImBDHN4Jr0bGEG@1-q*w0{X@b2ow&T3AGwtY*j-jA?b z!v?xb&a+8*-L!KXDCH^G?>kTEu5>gwyIc*<6L`AuC@!4w9waKTTOI5$$5Q(`+M&!l zg5XdeNUJT~+}3#SmM*U9b#G{}nBWa9fF#%qazf5HJL%_SuNqFGyJw8Miw+9pua>r0|F4f3>g}}H52$0(#l}QF zLb{S$s6A?_*#>gfp0U(C1Xssn#f^TPuwe(S9k#CPugLp}P)uyPlwUExj*cW}7w8|x z1swzQDY@0;bIBOTb%x?>us3$>4XEsZq99Uob{E(5E|`)kD`G|am3MJW7yOh44kOU5 zk_ipTn>%y*ye#MJnF|)ocA{N$=JHEC&*3q#{d|{2IIY*am1(*4Te)6`3_ zFYQ&F-TOlKn!N3p4&6aoAbWTHvVE^bN1mm=KTNg^wePg{Yu7HkyLw=Au_eo)+A~#s zVKM2!aYk@?!v;h3PvJgz-E7oCC>er0JDGnoY{8T|MuUgb`ASQ}f@EH9liyc<#5L34 zSou@aQNRPrdC+R1+=sFNy{M(fiKiNU6w#<0`-)yGsCtPbKI9ORLoHmj zdnbU(a0#|DwT$|N%)s}cn!1iJ!lBKfRNtw;;(%#izF}wn^1wcdWHOPqe{>XLPGS34 zR)3s4s|V#4LlpUi;lpWN%0+h)<$@kqh6YSNTxpaJ*9neCl*OOY%H68jDjhg0z}gOd z$0R#oBh+l8$a=dh-~^`T_t=_ftCW0ikG!zQaDMVf;t*z+l)B`(J@S=?^9qkbX@ydz zV*!^<(z&1l&4F4gWNRakScg3r%3VpNW}(z{tGFax5c|94D-!_=@&gZox2UcI(nq*# z(PNs?!_GOSHY|r7@|``(AC6&KpJ&yYa(k3t0p?5RVaGCs=Y^CX&Z>=&_6APC3uht< z^oMRlE1))o=zb5BDj|n1h2fuFnV_EeEXr|72U5fG>}@vKKFyP1f|LFwPwSZ#G^YBr z(7vW=J(K_CHl~JWxlf|TAut~E$@1nN#f3Fj&PWd5YP$7K96No7s$H;mW<8lGodR7G zpoq%8p5@*9%3g*&y;Wv#3W4Q2<{!!_!m2gcDE z(3RK)qsi@-nqPy3p(+%kE%(SXdgMhtquVzd4J|o4zop~f{_?dr@y(xwt@0xnsXj2n=1|sV5&A2^1Pl!m=?1thSkT<7`<<+4U^U?y^n#~ zclz1o%S1CuJ6VwG3kpyG3#8EKc19)~LgJq_Gz!d#%@j0evSSik8tW&qafV))8phSQ zY}tg?U+=958QfQU6`bJrbxEDdb)Z2$R7}YvmG-pq@mz3})UIqqi={S}!z!Hz0Vn^6 zng64*8aprOl54Qs>2=A_6jZxGt#(&3*O<0P>9v1=EkfE00drK0!~7e)cfN84CiunD zk-GwJc!*=|m|HNvs{3Y>Px%g2MCAz6yZh##x&6VeQ2MExxC2P@E^r8|Qe>>o>ijpb z5;Pt5Kd&)wV|as0FTciM%~4iBsL&d-HMYjAL?ePX%Ac|o=5fs1*a|aVOC4Qd?nU(f zvchCuyuyse3d8oq^W`7q^Ee|iNqlncnXT8rYV-v}v#dyCFki2fKQir+KgK%w!6Ed4 z#~N&scPT-nDCo7Efj7$3!J*#=$FlY7|IK<+OjDuPdP5=zYewMrY{k&digP!0me5~*9sC|#hKd}t5Z$4c&K(V z+#^4NU4ARG;d(C^w$Rm~K6j@3w-`aEFd!ts7=L;Q7sMkK>$>sUL_|U z!o}WD+ELK&1{C%*lt8dkA7vwk3meWW)4PzrRo)FgI)LCBY|t1}%Sae&CxjN0C=bBQ z)R?*_w|f;6T1J0yPKHJ7pD{p8XfmR(z>5%85}hE< zs|p33Qa|ZVUb<6|?lgP-)_GMw1jpw|AIl4FPLMiGOKvvGvu}=<2P!gnXDz=Rm{M{2$1$F|0X}_*=l4T?D_CSrA7n(26<45n@+D~dRbin}I zj(r%6+42y1V10t;T!NVDIoD5|>N#f?XL`1?%8xGSb)w z7NeE2Eyd8GoW+I5X4+Z>x2OScLRD4+N*Y*-k0HyO=?o%x7tU^G8N%WKBc6D9HYP$} zHBAGe^MmOu9^ppZno=Xif`0kI;cC%oIC@u$9w6;ggO1_6js=Ze6bwBO5`^KQL~KFUM8t_;;RkS48R&R-tXgZN7 zhe))NNVJ8Kh`5N6=t+1q65Y~Hi@rQq`Izov`gw0FKga!j;8#e&f*-+}7Yz>HNBp4B z7vsQa-c~D;28%$Bc^JgWMv9c@3E|DWvKrkpU2D2^j{958WrR!Tls*`K4EP-e(~?O> zlQ_vZ$Nd!)5~`fTZKGH%HVQ+AXJI>!gq|eosA`tVa8Mmp^88iM4CSPJnLf;*^(aUA zXb%<(EK7Y{$}q?~I@uJ=Q0$@PkF;?vWgTQ`zH$($Sd3sEN_(taTTx=oj+gaU!wD`(D~Qs{3SYnsm?Fz{1rOCC+f$#hb>LmO~(%i zT-qXV)<*OtJfbd|COqOHoqwCo|D?{pUFUyV=YLM;->vh15cRthl0PaV2u3T@FPjDg zCgPwyI(|7W==9dJ$;r}Ac=)qxlFf#l7obCY@a<;>Jg!BH((032e;j>4*hdJ+AgY+T08i|~#XZCgO z+rRIVeTOFhP}XlVKl!t=xY3_o^@HR1H+P-&lNCbjqm_awK%_f+8aogiSkvx+{)w}14S`HkCV|k|KK&PMH-y$o%af%fZw|Bbs)cpq(zvZR&1K;*aN3z_z>m-@T zy8cPSo)&Jyo)aDpF5REUUf$gg+$fC-e2)Z9Pvy;F+=RvrR4Z4Xb#pl5CbvMq;0(rP zjBy*Be>YH)WN{S5DmUOXJ|kZoMqw$I+9N2ip1)bKvS3T?USJl5j84iRw|iRJJ>Mpj z4fM2}^L!g$HpJ8NHMvQ_`{YpdH(_M({*V$(jDcHm4J{h8$cwkPa1;bb;L7d@8Y`z) zBLpJRq6UUH@xhd;o8`9Osq+qp^)}1XEj;c|oA~4_VfFLw5+u+-!YRHp?P#C~c|Dcr zt)=DwD#sLM2mF{}`?<46A}Ir8k=J*id{wMbDZLss6OD3Gqv&S2+YFxo-v?;dxT>3Q ztdT(CfSRQo#~c1=W!vvA+p=IIYnC|VKQu|LG>%b19HycKhAfZxf+ow8zA30kG|Zs^ zz|}EdLI++-qLB`ggELKQq+}ey^imW$;zNf`A)|GCD1>`9c(>I$bkr%0RcV3z=UnVJ zu@LsM-6^O5W#N7(Re5PAUc$w<_aohAs&XRIB(%*@J~7I9Q&8lyemM0PMHa zT~4`fH(mv0?+HO|k<#%a9~zU_#maLkmcKc>On#L4GgJoemXKlV&0eR#hv$Um)rKpF z-_hpm2IF${8Ziv;4ZIiEInjkWR2Fu2&vSo`N~A=HCpxFWx=!aP!lA|mUOt&uRv{JS zqF@^=kRF2pABb0#LF{3<^HC-3+wjKUPKCaX%+#1fa7uqVBXcAgr?GLx83kT(#-&nr z7-LR5>fO?Vnf4}Y69T(vYic^1Mq}$$c$rIY!v-@Xw~slLerl^xKBc~GghP#AJ;?HO zSzdD(49+ePS#}uN83H_Xd8!W`v~{T`3)l#sUEhtdQ-*?F8XLbd0UBKph6IdBH#WRD`*@_4#!kTDo^mT9;f<0{ zAo6uttcP$84I8$Y)`k}2+f(70A@>a~X}7B4FBm{9*&ik{B|2FRgf=P8QICuJQ&jw%ER0wE*CFn ziQ%H*a`)+!*`Zn zt%qnxpGY@qL;>SoJ009rOoY_FThZ}4^@Dv=K-cJE>leJRP`KZaWn!!p`p!Z%5<#%?oOmBeb4ImN{lOO_SLbWgE|nl1>A@jn(7 zcT&cL+;N2!h4^kn*5bL- z=FFUqF01zhpekdroK1|LXr(uN!0@;}1BPcW#v*LEE=;{=lYlEV$t;wm#vP|Mz0h1j z|3zt;EEn!c>8BT+I#CPk)={fsD|W(<#+TW)J&acHU`ll&UqHoIW?4S%8$(%S^HliCnF|cTLdWRbLabsGi(vh;IAsZ=invA=8^1qaF zEH|xL8N$u-hhsi!Sdh^dM%3j9Yq-NO=6ln7a#w5C1PBmn$IRaCD4}*h{v^84mKxS+ zwJqWtxhC0;*z}s@3OMemz|dC-R}#Ld*F<7PC|*{8dZdqO!laj__750Yv?OS7q<2-? z>KEYU<(79n-wrMN!P9b{+;8qkZxioBwMTSTyl@fme9x6YwEv6Svl6q4`I2;A&lQx?kN6Fk~isD$7;I%uL(7*+B*_xi$Y~djaz#>D3(me>!Ay;0Co5NN)&kS9%{e602 zRHTELxMrh+^T6(6<`N%9I%ttp%WJPjwo8tM`8T9k|Ty&`wk()JT?SZbQl z>a;Uydq~&$CH%n>sJE8aZL_9%&sS}Zud}7h2rjNZPd92dr8X=xr7!K-oGTyM88my| z@2pEoA#c3r%iBHgd+L^?7(B;s_w4o5El4rq6C*);!!jdf7_O#z--is*6b5grF@26u z9+&R!DXXU+9#_Zaw(==la5zO=4cLh#;NMwC1erw zcfh*UeFt5ibK?Uv*c}A=Vuae9cyWlX&ZV7EcO!p6p92rzN6za`+f#2IKjX|!k64oK z7A)Ql1be@@{mf3gcr&8wZR2OiM?7EpJQqBc+P4tNQoRBXI#qp~>=!$~i0`*g-g`-E zvh?c{6(QA}o+8OM4IA=2c+8m&lvdt19esYF6itK&1aXG4DY}i%#L(P9DKfRP&$M{N z6bhJ#a?iBbamz|=qUX5JbKc{=hT^X39hN|Kl)d8sHL!=$ZTxV%>Hzp-9S+*)<312c ze?17!^QY}semah~O_qU&i{WXoIp`ADzRxLAS%?s9Eqjzy*rgpVgp7@Zct4}pW0X2< zlW=r+h1@=i^8F6^f_Q_iN0~>(x1wvxOYjwM|CU~C>ro~F_?16m9~MOOF!6ED!9GAP z!8PU?L6;s&Ih$X)wvOziR}RFbXu$vA%8T4iMcss(tO$4v0j!OG!QBDYMtVbvg;deC zf&%tU2wfZhjV`Ed{1^3-weeH-Mc<5qeJp5F!-d91_1%)R{kUUy*yDfK6C7G@^6a$lJkF~HnJ`u8#t+veAKn>EOgnIP z-}PECAIU9jEyZ1gP3pU=xeIA?+ojmi+lI%jv{OuTTcD$+$I+JsEj1VI=Zb5-qg~;n ze~E5Ja4lb_h7@mO@os&*Ss(v2i_g=?TctEz3aDFVTpGi6nTsXrwZHBI$ur%CDGuER zo*mRsX*v(P&n_z#@Jsd_`fvB={)cb*W2G`;vptJxGFZ2;1Ay%XE7+y}$d~DaQC53_ zs@(9`RpS1#s()96!H@y@2o@12(L*2}mEVFhVS;&2IYR~x#rqRBmD=mXClEp(16n4( zXYv(!ea0e*PsX)#e7%X24}uo)Z+I}2N-<7Cv!N8no7#gnWK>yx`3^!err`rn1)Gh$ zy$*{J(#BERblfT14tILJ39pYHXf<-d5%R~T{h1Jq$wk;F8mW97v+BziP`-Rto?(>} z8;XU7Tw_B>t?6N~?G z7Ta^lN6?4?3Vjb4FKlDvb8H5@W~F`1Xo6sz1m=c)4f`Rwyo1CAvI&;I7ho7dy}5kt ze%zaFvFtq0zY&iXKr+*}m1PB2d7wAa0Mgf6*!@>n0dZHZ4VkKsW4?Rtjhp4&+m$KX z9y5KS?EUzn17V>xqV0Z?%0PE-5EOo_HQVzB5ITF`DEOMp?5#Gn5#Aqg~nH(XXf_TK{*sMrS`xh z7}x-52-RE6;oI?l=wKG`JoC=uMrq%)A_*2p+`uzR?ZJD3Ybj0mT5hwQSt60f)G*7W zB{3mMc5p_+Ybc8qhNBTyAGA;i-G*6xw1hkoUW=#9p>@eHvaJiGrg2J88?M zf~-&&p>EY%J;yDU*ILwFjMUP=KT3(;d=ac8^Ee7aBC-I3TG%xCdfq%q5p#MhuO$sY z8HW#i8=;@PR3Q?wasU6hj`OI4>s5XtTE&`d#$FCehG!Cem(dx5>*j+T4%jH{M)xeZ zj(Tfd-dWFjmmM8{xU*cl3b5h)C}O4o;-JvgPK z5^tyUJ)lQDH^nIOh;$(m83LOjn;I!U?&0KxJX7#a9n?L~lpFDVu)Lm33Wy6{3BCcs z!9@MQDFZ}4*hf0Unk4yxmyA=QcPgI@!DOj@0qynf>MnkWX6c0OG)t`#bo_2o_r?CK zgrHd)XQn4TMLAh)DK9<<&?Md60lY=!y=_ zRql{4rIp& zx)2s)IVvA4=Te43;D=rz0RO`W9{joO;6?3 z)YvB&33~AUvqnFEFo}& zYvQPCjMfHm0LtD$&2cFw|HL}i7ROqLqID&ybZBs5HuiX@(r|HN65d$ZL0(t!ZnQ=# zj9F<($%K?( zNgPO$q4}-wUlmDyU$5kRFj~&aUJ;nBtQ@<(s@r-cfoX{)q2l{%exYVRrgBQ8vMYLJ zuttKju33!_U!Qg2ST)G~T+g#8)qCeT{q^?e~ZkF_~FunK~`JMf9n z;4n6K!gD&<>2ZfV=UDw!bxFps^B7)|qRDS&uk9)KMdmsd+h5WGvncn7f^-=J%6u+^e&8baLkO*dONO~j~OE^4-w-wZ23B+ksTNqbEgy!N1# zWXltmlP%G9Xf22j&Q#Z2$SVpxPh0)uXE*mZt^pa0e0W9FNb!^#($4swn zqIee+fi7@HaXX0&Z)DUVdWm0(Pf#d*Ujn?)*hnYQdEJKgbfTNkA(KB*(XBRaRmXn}vvxknU*BeRVYt2eBX{(;(J zP}>stMHuTXYeEQLlV+Z7$%RRQMs-OpD0diRRZwekE>WX{cMF88wibhVJ8{I`vva** z2!7qD%cSZtSr`f{=?@pEp$Tbd0KN0TCI(1kW2~IyDo&!9GwO7Uro2U$67w8PZw0w? zid~d=@*G;v>D;^p@;5I| zUQ5Y$UDU#D7pM9irTU|qiuF9A9V*d=u88Ha)U3j?=G~&eu$l@VHQRt@-$2c_vSyEu zrB<8$Jk^k))(3VPB>6$5dvb@`c{%|9o-!Hz@s! zYI?25BvB{Ey0B4~B|40JPH{WsEK_p^(==To((fsk%OvC!pQTJwwM;rXCFs(#ehip^ zgtlnAWLKh;_d#?Jj{ZB=ZIuZ>a1|#~mM>I3(z=r9Id8Sp(*J_nyCn&lOoJcu*)j(brbXFwe7tmHh(mu*%v zF#$1)_wMB70knf)7>5Ll6TN;xp2ZsuOWEq&C4@9CK3Ey;)%h>^ zG?AafW)*+-2s{uL7#A0j;fTsdkz5zl*(O0Zr|+BK4R(1ZFW-d*H1O&Y@cwAOR3HQ# zWZj{83PFkWJ`o~_O~49a?(Qa9A#&w&X`gQqYa|EP+Np?*qeLi0O!2gTA7% zhC1d$wY^9r7?CHX_eUQ0 znF~r^CUGn%#=QSccjTqbvGuq5q#Y(|d>qGVYxrk3m{)4;d4tYSPCoE2Wi`Bh)4}r(2ZSqFcqdo1e)aZdAImDF+bX+YjjKz=rLQQPw<`ZoON0^JS8 zM=!KQ)LYg=7WeOgta~6IYKru^T@93cF6DRqBi+Y`zp1b+l^%@VB&TxLnOOMP-r?q) zb&%RfZ|fCq%~==6f`5wCtMQriLyUN^WZ6iRGDlzz)E4VR^miZ(wV-h`olpn<$;MqP zAX`^JjQTlh`Y08L>r!35no_Ff1(iiKwz~{TmofGNNwwPde*eEUzlqAtRm)`;8iIz# zhG#l3BbP1L_LP|LPjz9xuG@c53k(Q%DNFDX72+;pe5==IqL1(PjLyTbQ2+)SXCqh# zl&62iTEc>R@YM{K`PXXZOZ3acSou9r;??rK&K?vAD-&##y^G1#+7Pv~Ey!(i(y=WL zdJn2jJ2_0U_)xaWhG3(CkvT`Z4-m?wMyQ=MAY?A_8Vh%g^C z!{+@Z1eJ6qO59<(7RDya2z7GAMAccnaMJo-5*8AW_xMs2SlAHgfSyo}sTj>#QnULxlVo(YYk&t5GT-d@>!8?LrN-DxoX{jnoB! z=tOOV(*N%rI0x+pjU#L* zsevR$bMVeRBZ*5Bqd!G5Xf%`9;RnpBP^B&}m{j?v&I(oj(PePP*<+(r`7d}Q$^?UT zRmPaWuGSDu)rAwC$Y5T+VN7D)t8x??LS(wk$c|-vgOSxb{P_P`E|ZwospTqHVHsh> z8Kj)Y(joaKJKNoT6(a@v!v|D}3M2hDy_BxU2U*0qqYup#q6NoeM(h+qYf`q*iNQfD;H=!7r$jDyxs~SEZV(Wtn}eM zY%=m-B%!M#N7Dj*gVR1TGi! zQ(J#5-PwuOv#oN3J<=~}{jmnydusX<@&YUAR{9Vdm}UgE{uPz4sTPZV5TKKrp&tMd>upRovLC&Sk-XwFeH z$WF#0m_h8_SOgiwSOl|tJ*!4goou)CSS%qKAP2L)D%g5agYH!$gVE{yF@>(yLSfIQ zV!op=yphEwzjmfRHH3v)Jz63o!BYgab)qef#i8F65Ia+wYNJymw?%pU1g@LL5yIqU z#Nj5PhQqk56%jA0xL1|1Vk^bo^A(Fld)6f>!@XKkI-P>VcjNzw7od0eRhdtkwm{Y? zrg6KlYl6qhjLPsNGNUp)u&i5gEXF!AjnWJvKbhMjei`51&Q1h;ieh%q56pJJQl?Eq zlo+Q(L0pPZQ^BQ8fm#ZA5_QLFDo-Y|yl8u5&h%iVNzW79i&+F@r`t}&xNH(@QZzIH zXLZzE{Gkpx6E`M%v^EkqFPhr}HMZ2!a)z5KoR}Kzam(iy^>{lq zeu+9+*kJU?3Da;b27E|HFR~+6qif+RX(?o_Mz=~`DXPi)ByFIIJE<^Bq_C6Fl18`7 zF7_QzvbA+-Hr|sk=HmbINu|4Rs}lU@!L@Cy0?ZQU67ZTK^U{gp0cJUj)@;<(3^pW6 z5M!vi6>hEM6x%1G4YJBY>Rg$M4Kp7&i1m!l8eanua@_k0cOkq%L5*oel#Hfg>rYJ#_)OA zfYEfc&PPm+oT#x7)=2ge!&S(_#0We3W?!_4-q(O6#k9emi#DU+qOCFG&*u9X5>^AZk!{f}n$d8Vt>%1cMMZMNu&maTx}>0UefL6HTXW2Nz~k z+(pL)M-&GGZh^)GMn{q1K@boW)C!FlF(Uyo^!Gb;@9lIVzW4tE)wk-@sqNH$>eQ(y z0w~ctgk;Q+X|+?R+USFl{;&Fv)t?JMku$O8k-lZ@vUH>(QPU-=)zJ#+j?M21bP;(Lr&y2xat&%R$NM=C)|(Xh+LG9cOD(e!vW&tg^97m4D=q46=FW;<(#)L^?cU6tX|4gx__+3A zv_C1l(1KHm+nu4QX`y@4Lx1cT8lMpwo)x;87ba|>F_{s;(&L*&s{xfWA+Hg3>5)UQ z7xb{F2iOk~(6a_4J?uRt&33ZUpe20{lUB%mUv19}t{80D2M1T=SoS`_6$O?(E4X5q zW$zJOG1jtY2Um=??CHT3TJBTg?-*P$0=U^9!=(~wfjYsj&R4Ls57t>W5o8Hzdx3@H zx7wXGS<4xyF>ieLWs71}O0i1zX(&_rBlI-A1`#NnCpM{NVlyPMI-~Jbh+uy0PclQv z>LOktG&xr1&8uXFr163LCL_L*XIS0(4A!XmBQ-4w|D2?Be_~1x$lNLIP1i>}k8igO z`K5#$YlPJJpoU9@@C9n>DKnX&njTEJt0=^*Bx$AzXct>(5XlHw*>vh;tT0ox6khEy zg2#)mQFZa{zg7GcKSG|cEp+k)f@`JlrIDsZ8Z&-r@wG!~f4|D(LsqrLW5{fo#}u8% z==d{aF!?t#=rco|D-zO)88qb?WONO`G@8_}H`waNyy~{lkr#Z_I(1`&znH|0DsHu_ zsfvy1met^4sjO#>W@gOw1DHR}5W9AsA%tTnA?`9lkQaOK7juk6PEXpm@Puf9Hq|B} z7b4Wj8nB08D&qLZ&R_J%qMln@T~D`xzmP8!3K4b=C~VlF2#js6QN z>1|uED14+qoX|dRG^313dZ!({;o2h;*KQm_e9(?Ky$I5>b*T z@FMOB1NU5?C?h_*o6F6^4^J%+a%h?JDp!vS&UV|YUGj?VIy#1W^V3-Dg~xGKxytxW zQvYPas4kIPCA6NH`f;0VvI_8;_&;1k&VEE*8FoE~d(AE^@)m}+3?|cScB$F#kYlo9 z=_$yaFKO#b_Af3ZP(=LrYshpb%RLPYa_`*S*emu7bj#bn9wd4;c&(x2@<9+2@!bkp zD5^J}A!^YyX9(g?Qag0qrmg`l4Df93z^z;=YA9#^vL2k47keZj9-_$+Isft=`aMYQ zc(sUrT=VFqF{t~RQs60}76H0Q0NFzs`6;f4+Qk{{M%C*&m?pTaRjOSA6>1sk=a5QU>eFvMiTd4QUqP|AW?w-SgsAeg>@-d$g}XxCE^g zR&~f#`u|01#V=^BSY9!R24da`o}f5CFcgvAo{<0I9%Q|EG*zg|o3azQToVIpAO*xadQ`pr^B{oAJW9gqAj)G*%o zP;iH0uECev0f|n=icDz~J0o&YR@}u$ZV)#}1&ZFq?>c^`O;tZGl!ie{4a7uar5M9_ zXJUfze&p@r9?|m>h!S$hXchCtYdYuXlJ)Ck=-e*OHt*MLJz= zFAk=5o|m5&v&dt$YY@NUl($^4^64RYA42|AC+bM$itP@5CU1~Zg+8P5_Wo60mA0;X zJmk)_F4RP@O zHd)RM^e`RU8Q7dDm6M=8pviNWslk9dDAO5mybFA{&AI#LJICC8yH6;2Hg{?U{4gc> z_0mHO^$b^Rp$jKoSKKq3_9{Q)3yRgQWcQz4l9%Ecl2bQ%tmoPII(g9AxYnZYnMupg z>JQuAIau!MB)mZvbB&PTvxqRFc0AfNd~@I=*AQ(v_MGK`zJioA*C}H+IzL5yO(uG8 z7@uOU0tx?`4*%G1h8LvY2tQH6AJ*X~{$_YV`i<~YBz&*#lK+ms8D5Zn9X@dmSgq?< z&jDs%Vw_LS(eEdkcd?tPywF1IXU~myKx@74OK3mFvPLCoEJJgGu?ppZ%L}1xbW{Se zL^wgcG^eSjcpHnmTu5yL8a7$fRDrn=}pR$W>NKwl!g2lFJx{*s+`)8P4| zZrce>&}yD2uc+2hY2_769a5iX#(T3lUUyraz761)u;nuKeMfSZy9Bq49hUn! z+*NV6ZZ|hby?sOZBI<^Rf2-XI(y!}Hho2$g&%a2*XZ~h*LHc!gG7@81VavvF?@TRZ zy%#R&!DPX`-%l7QWM~rA^!?1ctl&%mC$wDSaBun7IO=zTP|`=wI2jrGE-m>K_2`>6 z9!@XfqT_U)@=huWb}$qI@aCA@dHdw;q~~W2XZWffD>PbeCf>(w&#~?r8e<`YQylk{ z;64d%!UZp2xZ~^gD*?PUZGtH*?eT z-ud=ES!Kyrjl72Il+mU*xqnMs=(s{TbW>c%SQ(gc&2Ju8)2-3}JuZ}9R0VhOuAOM5 zLtUmLbX{X`<7HpWSAHJmLQc+^hV?m^{($ zE;)7Ye0it6d`YY%ChnNHf6N+u%2(rA7xApy)pOhRX8hFmlSW}*&XhMv&mnhbleLa$ z{~CIAqd!drXf({l4jw5*(W5)poy_5p&{!s_gnkUQ2R+M-!JN}azN-D~c$c=W8yeb& z(i_r^Wq{j0qmSt2p}ojP!-!IDq3=}w7a%svetJH2_j~PXn5OQd`I2hCUM_iIb_0#h zroMcR{-)BA-{EZnR+gd_1StVq4kiz?$`}v0k8i3C*hv;SB&AfmC~qk!xlpLk4+SO6 z6V!Pjy2=|+Lw}B>yo~_MUc?en8>K-hJZ$2@rPjs0-;*wtFj#rs9dQ%yT}5>9^>D=< z;pwOIc%-Y@&D@4!Yvs~3C%->f?&CJ62kgd(I`J`GRX?=*BesE+s*&gusn2`6Z{foP z+^Aj=i@L6f{`BKjxLEJH)T1|(TYqm&K;s6f@r3)8tAvbOAB2qGCXx|!+r1cj_c$GY zmA@*j8&KC5d5oy{SdG9un5Hg<%+%LcMsh}d^`dn|)C@`J|Ew?S;jpd;|C2&)P3mY; z-q4>Hrj#t~7R#DfKlJBCsaynqN#=vI$CWJn9l(ad&}Y3r8IC%nlmsQtSXYu6r zG}$v!$ua4Q-Dh%7mNl*WVk4dzq9<7Eb72q9VO?QEmA5gSr>Hj6Nd!+z1XD$|Z;LpH zuECSO4W2>WtR%Fc8flY>G%}HHWAEkMkkik_+W^yu0yY;Xd zWwBygV7>(n2ZG^y2hH;-mhwDfCMvGZ3Ep5t-&&qqsu(Tn>aA)COqWmCLW!~r72GnGHRYk=70E+zlJnQu;O@Ts%OxA3 z%ICM-!G!zWYkENMIV-6`+~!sCHD0{_wpxa4r^ef`xj%LEk3Yv^&wnbx-fRjcZZp^p z2{zjdCh!eAB-mntMdEcbagP5ssS~LqxTv;~H{Ur|0KAZr({Ke_|1A4(d80;{t7aAX z@kZG~i|UzeRL_Cqu~@k?oB9#DP&xXUgJMk=+MB#(Tjh<}L^bEatdYbBZ#$RgnA9oi zmE-Ybe3PQdY{50-niDkbWvw<4>69+^x=fouJH0D5Rflm^Ig+C16&f`BlYye?IU$bXsB+lQBZ7WY z=}i3LQ|B2Us^qKJYci9GUHVvGlv^>6{S>MpLw!_F(qD$|1~kBQlG;RDr(I^kYyn6* z0DcM^db_FyZZH3LsN;&g7g1+>4WMk7+z&|;`AdB669p!`)DifcKA^^u=rRPZH^pBD}mD*@0^R-iIjHnJZ0y)-Vp=+teya5Q$WL&}sSooxKW~JJ#@J1}WU$_qK=uOl z*W08Ko!=*>SKnG4nfqH*tys@zUE8WE6%}}u= zjOv7N!X`)hsWqXp)b%=tZ#55EK!9+mqzyR&n_91z7qRu8E)>?#37M=>)degj5=tB{ zeN5*CAD51GvKH{P%3XSrMuj5i4^~OM)#?d+8L?b}&(fn)<8J>rtj`!;xq;7eo5erO zivJ~66$PqWV*LL0q0+JVtKmjq2k{0z6WN)P1+Dw(V~mmoNG8a=S1kQlzKErb%?GAE zAsG?JZBThSh1y$%q!vdN#H7->>Ha~X(n?Z7k5F)~J5(y=LAOwtM}-rp)o(eaEEO4m zpaXR_zoP;Z>Y!!a*>pmB1Yt*#s_U(EG=Yn~m$IJKb)i<4u~H^)kMd>Ryp+N4+fWtF zRmRtIpl&<5YA=ktmIdwU!JhfDMv?u8xd+)Dsyn_t@J-j?g!C|L?t*<84QvS0IvxfX_*16M-<5|`)wA4i;Sy}PuwE^@S_0Nfz`MXn=prFN$ux`tm3d3N ztB6L^47h4%(I@0hblF~@xFVw1_1dB->TB9xsIIv8?_}*>w?S4rYWD+D$_`S>sQH*_ zgxdzTH!zhL$K|qWuk*}R)s0}9@82>d=4G%O=#r470=4w!cveIqREF+>hQ1o%(9{2} zW1_b9M}`8neM~ki&?9Q_!&p>lZ1Ldo8?KNksW;=s$Lb$YgM_;3=izHcp<>DIKkM3P z(zO~;tpUDc$ek_O5~^;tPIt%OxY~f`A9Eck9ez)6dP6Y3QSb0~R+J28xgk7H%}Qri z&^6Z2=Xwvo5?Vn)=#w!U=$4|9sJ-Nnx?_L&xeAl-;@O0irc!*r5b?7m5V6h}*Nn9b zRc!0m-)8H?cLL^SOoOotns1DdHKBi3Y>^z)(h5U$lS7{wsYTQ(TDHtIWJJ&5L_=8p z@4}`HNU`R@HpP{38F4*r#D(g>^->IoJK2nkIL;WK@oFQJ_-u=(%N#yo5>qF1l1H~t z+NlnglEn@cSwl$TzR{3GcCY8^vo(k6#BzXVU#dp;-V$}Q(1Zg0E-Cljp*;qoel5lF5#y6(nb6a|DX!6ubHc};~M)fEg z#Nzg3mK>_8Wl}?Z7E28oJ=vl|7BrCtzZJ6! z&_?4ow80Y=1vC=Xu)+QO`4YZA9^uJJLpLoplSu048ziyVR7boaM?UBx++-N&Fv&4 z^U=`4lwF-Wg34-$CXEWuPl{f^Q*hnF$kOY)Jf-8()pQAQ34*+C`&&_-XGOUs&x}&a zn#VySM0jYqRM-CAU-9DH60_8?{yv849SjZzSsSRMP~i^Adly3SEnYrM8s3f#yv1Zw zzWb#0{ryi=wr~k$BFO+gggVd1w7N^0+zt<8g5DMie~H(9W9Hh==8FiZ2GdUDhiFr&MtD@nNq|9JDKVLH#YX&kUebWESms2 z3Q~sPWGWXIJNAyq9)`Dj?$dMDsb__FLqvb@C)4sM0x-mwu0b!Hd7!e}1`qWUO3Rqh=tU|6#-%(b1;UBtYq8@FgdOC3;d=qKC73Zu9L)$ixC;oxhB8y{Kr3bPTMF zpf7UB7ye_`+rg9%7U>9Bq`5rhw(H_bolVK)7+=5OXTkk(ch8^ZbqVed-xv$-Tn!o8 z1-DEN?&jgs;70!s5K>;yZAzNgj8fehM)EIY%U+n(Y($j0otn<#CwS5g$cfp3wGY@+vgrH1{?wlToa;>bg0{Kpf!&sUP1et^HMxFXrQh#Jy-t>f z>BK&5YRF$xI||!?J;QqOI%LkA%ZFVy|FYZn$WYTK$Fr_7DMIp&)zL#!YIDHjy2Mbg zdr5n4e}tx|l`M>)x;ZoABNMtLk?j3t8?}^8XnOt7>Fy;r2qF{Npszy7o^_L)vFsIN zhP&KTu3|*v`w`#LJeT`NzQ5-?3L|jK*l_p8EX90ghDpKxHaG(+Rgp||OhNfIJ-^Tz zYj}ds8N4$)eLC!z+GiN{!qc}Q#M(imJtsIzPK@yJTvVa2SILPf{*TtfhO|X5IG!hq z*Aic+!Mc=*lHlG03lel+Ouv;^zski|Jdn{x;`9M z<#apzjXDCq_!CsLcQ?j%ULW!w3D!khYd`7q!Kzlj_}=CP@}c>A=c7zKf3Fem<=T(F zba5rHgL-hjHh7}vPdDLT;3@5bf3nJ%f&PU3;?YN)1U+b)3GLnVBWt--8*Zh9`{O5Ysb(+nQWVAi^r#8?t z;TpA{=c@2vn@~XC_;c`>XWi#g%}=og3T_Ph{~VdX;m;8PZM~OgXReRv*P9q>Wd21h zIazzqlko-Pge;%+qrx2RUBs5@0*11lCuGBK3M7ai1TX2ndP;^fcx@4u6P3iIALRS1 zK5rS1An(Hue4*cXj=u+``3yX76GMzJu9BQn2pg?f77GX1c3p0R4YcS&aejf5G}&|@ zo`kZ+aB0JjvDgNAgF*ErZM3z5^*UHG<}u_B-Lx<-n&a3*e!sm3XcdEYrmWIITh<~n z8KINacXHS&0T&@l^@#dW)}L*|Dp zUeovZm(gVRA)lk{z-x~b1P{`v*EKSn)3D1r(BCjcpF<9F zkB|ZT{*H!z_8l_IdmEqo19e*FJ@wq(`g`*EV!jN_&)uorKRZ`(Y5lD;D?Q_tNfFPxJhq_IMoJEbEcfC9M#+FC` z``pgKjcPW5!|#kK8R?>D99b{T>gQGHRPyigtec)*aw^Hkk8^%2&qv-JsJ>ckUuz3z zK7FU4Pd^emm!H_bWwK~w8rCAOPvG?*OrKGP`3v7M<3^4fK5n&JPC#?UMM@U!gcq`= z?`shS2PNkDD1XO*?L+g^mUIc6`0qmAL0r;#P0njP`{5gc)|A(d?_QJh^J~%0y7ym2 zEWWc}`=&v@9m+O?Q1rUkQ(lWU2p&_JTx{#glLEx8*xJX+Zv!WkpEgF(Kw^Y_r#CG% zaKbsyK49w_Z~63Ho{tK5T&?AQBI-tPxZ4sq*?x{|gLFj6A9-?-r)V#kwbJdr)ZmuU zYaPG*Ty`)|WlN-Ee4cCk_2u4^Fq(dNZLK4!$Veu+!=3cn!Bzym+Lt!me?t9-0fH&^ zcx1qy^65Woife+n%cmb(?_o?I{K-6f*(bJW_^FjAARZ*v8?bW6uv}l)@e_t+`%;+n zQeQ*4p&Zfjx2l{%w|&+uyT6w4T;0gR{QBLE zwD>)5*3mI*cCXyG=$Dm6$GyMUhWlE5`L6UOqBOeIqO?G){oIR677le>GN*ghh@lSK zwF}yu<}0Af=Km1wR#ctm7{I;LhG@r+q#c<^=LkZM@24VBQ0;9f+IZMg6m*nLutykP zj>@z>6Qk&f>GWcbLnk?d8(V$hStc(q@jj;YqUV6Ep+)Xiu|@U)u|UkZu-ivMso{MI z{*SAT+M+;^HDFw|V#9bs%_BKPSwpJr(kN`OX7>8^c+Qro&2}AU$`z z5TkrVPlFczu4M4~7r%p7Og#s=II=|MIe*eAkvIXYU{8^{0-! zPKjvTl%!3Hjj_Bb`y)G24#3V|!}SrllwA=?QZVi=X}Yml12kC(SUgfi{9U-8Tg2bF;>D6Vv|zkt#1uusA7t7dU^gH7+X=2 z628$7e-zfjggcnW>-OK(U=Tu{lNg7&0aGKqg(IGfI`~%WY}_VnSH)H*(%C3E;Zj!7jhgI5tzOC+wH#C0)oS=%#Yz|cL;_KdSG zIg}MGnVyHiEAfujU=vLmsQr11NH(r~aAMfp;YCYNE63a+o_8y6uPixwsm=55_S?75I1KY@ljq$p zZr?5gs91M8Q1IQb$JBHX6SQ3jYS)jL;bW%v%%vXyxx;C@K6xXNk!H#XI#Pg6Bkeo7RQ<-tG;y2&XKm+l-J#%lSM2@ ztGuU}msveONl^m_mV}+T;Xxn!=JuVdUxgw_qF1Yb$N_x~<4@!?@GKNBfU^-py|u6WXZr`o!_mxBqk(xeR?_ zJbvIn1&QNW@4C=No%tt@pK#Q9-iMeHkY4Db-!!e4H%&Ef zrokZmM6=Q|tV%19O53!PN^@pUokm!b<$}OXTexot?}FW!BYONr?ncQwO6D6wh+$e4 zsZ@J9F#0JW7N%@Yc;N za-d}x%zVh?Jyx{gA1)OUWDd_Z9w*^y{eZN-A)J6wmbo_gf| z#S9p~PY#y6O)?AQ)?CK&07vg*cAden|kkGs4TO?k*Qr+mjkw%(g^$$0Rp zdMj-*RRJ1sU_2F~#4qw-r&$8VtWnCdGf<>`goACiy&H|h;{$%2D6 z{{SqBVFQ&~vq*UKcX)&gIDR3D!)p6UGm3)}h1ou2z%OsJ8Nr)nTjzCIleA$r)}a?K zOdUGMxx`iG<OZUpaZ~K*I$chglB?90x9fPx!Mg3m$>1b+6+ zYagY`5&@!O7@#=sHc zHW)4do@a@M=rt+)fg%-uMMQFzcd}TPJTq>QC6CNLngnqbI2Ig_;qdJ@+*v3XqEW2DwK4 zRU==ckwphE8O<_~>qiHaodf5LXpWhgI?iI%{W?JBrYzQloTU%KeNtn!kFB}S`{E<_ zfv47f$JVn@{YC6#LC2oz>pt2yX0-3F=#oM`e(MrJnxm4`xjNXJ1d|M4j4?(z7!Fv` zk?s+ReFx5|wPn9T6CKwEnp=AC8yf9q6YY7Q1eNpFskQkQY=OZ3E5)z93|OJ6l`w_s zYRO2I_iG#P5!TA-M6)*Cnvo>qA~IPQUC6YU9B3H5q=WBI0d>Cb)_`*PZVaf-zP8bu z0_tX8N?B{0nXPz z|2cHDq-ck7@7IHp%Di8*VMKbcRE8jC*TW@?zCpOCh-F`LQAL_9n#$rhZJx6zpwgrf zE>1zAl(acf&>~cV-mgQjskK*w4)ABelxHNH(fX2uS}?Z<%caBcX?U7alGA+<`d%sFMP-T*xVAs>G^>+_Z(0OK zK#Rc4^inx?Gq7C;J_fW|-Mwc79;8#AE04DnJYOOuZ!6)VqL;eh`DMBtB6=&iaOj9$ zm53foXasYNh%PQvvn8a2!tC8R{kN^CYHyKfo=Rw7z2njJ{B<->#-q_4?G7^< zd+oVIBPoWxr*yehnt0WUx}8Gxj@WfMbRT=esIp{fHL-hYMAsmra zJV(Ba=sqA}BMRLDW=RyaFN0Td`5&PTf#iiE9Z1|ppfU+mTcWWR3YKra#t^%KQ6w1A zn`sWwuFbkIx?396#0&KN6Lsi^Od87(#`U>`RfM<##4T*>y_5Pq-^dzT*lfPDGO&H;u4K@NnJB@Pb(1`enwJ=Z|6s72 zh{k0hSep>j41-y7Co$=LOFgj#^Ryy=<){oh zOIS!w?8f%)a88kf2MF^(`xKE7GTyFyM7Nl8Tc6aqDVp0c=U+7Dp&5(2XyL9<`(B$E z;>#GL8iN_K^9<&Y9-HFhB9G)(DDEM_A#*_X{n6IonSarRNG(KgK5V9(LR5!EI$B_ioPc0wO)u8@? zU^mN-ew&1UWbw0htm)gheYuhKymmE!B zYmauuoQ3FD`?X2YwxdY!AxW@d@uy@%YQto4xXX+L9@F zFdb|a9XPI#_#6w<3~b#Vd6-&9>%LDSEjM_alMBa(6yuUJ`y*Lrzc-k**@qMP;l{qN zCvvP)X*pW{k?%D1DD+0EH6@fxh-j-ol@nQ=YyI1~u+#EVRl`U(DkLldx$Ub4xv!-y z(fS=%H5&UySO8}G-WHs`BZy)%WKO0Zpd(6+6jghV!nD$7sQkhutnz+`Ic_sni+`s5 zmwA6d9dvmonRe8rw@`Q9y`fHeqI(>2AmI2ck9pE@bdZw4zehS-s`*XbcWMekp173k z5n2#SaO42hqAg-Qp!R`9SYGYaQC5@{F-+&`co(~$7b@Y4#P67}w-$Czy^eY{>m#{0 z^0=&;c9pl0tdZiwG%Nux1uU|S;rwG7eUXWNJMd`F#E5RiN28o(37i;2*1x3MAtCmG zI(Gj#2t$_sL_O+oRfLly4*&>zzZZs+hNqfI%3)r)_m@6NbKJfQX`)v}Z)6IngP(Y` z-1~i*_d8s$gf!p(7~jLuD}LoKa5)zcyu;D1rj78mMtI9#Vm&PT*2V1#WkaEUBF9q! z9*z1-7JX-*{|6QQK~_odM_n_R#1O~bI9~6_U?@&4x}$PtQIhv)QQ&g%w9P}?s`u#7 zEsF;i1-wURMhB=j2rbc-EczvhC5@RQzB&idbQ2C7c!|Z0w#>wW zZWSt-_03wLsnG}?lSa^*?j_Q*D}n2!a=A_SvGzLXcnGgoK6J(u;(QB1Uq+KwA!fDY zSeE~=#&SqXRq8RrbE3#)8f(w{fH0b$jpt;Jw-C@Y;Gc26MCa=zPqP?{(kV@teKqDb z1HMXQ`j;`m6u|O3T!hwq3Vu{YYNgK{FP=vsh-L%3Lz{YNij2cs#>?6#J`oXvA-{ba zC}Njo{mhv&Z4B(Tg*g6CMIQ&SnQ?>mvy;tF@7}Hxq^p(y;VsAKJP8@!R45SF58ej#vQ7gU#N0-m3;zmgV^D z&^{V>m4Um-#3f!?;;^Z)LHnKHE@v$q_C|H*6Sqxc@`N%yLHDSgxg^^!Anvo=!X#t>sOv=Cr;~ zLwu>4*7^-dK{v^LTNAoT?g<9^%_g~{QxYQos0rJw$Ttk^GgRcGO}J*vOHJIwioAer z$}yYoTKS~SAFV&^sjI!ms2%C`N#0}2_RyJyQk#iDTmJeVy$wIYrmRtV#8G;Ltap#8 zG2cp$I8_{=?a)$HVWD(}_r}S>D1KBCfo#%58Kc09CtJPCCFeo^)7n&>cgd4QxtHec|B~>9;%sV)RW*gH+oXB;j z@9VZQ+FCniYKOebo*}Cv@^9WL*_NEsXst2q16YNzrdzsMDoc)T6E1QT3-4b`oKH|o z`^hnbaUm1Ft?I@xO_1GkRn4`OrNMB`e{=q+7nf(uSv!TJX+oD_|tSS-=0 zNaEhaB;5Yh#fR>czGYtA%EC9IrjeugodOx9w`0D=IQ}J5N}XrE-goHrAwxcozwBV4 zQRR{YhD4nc#eGOz74(gt8_99X5tTPZM!X|7f17aOk&4l>DIR>E$asp_29M7)=*6zA z;69RbifZoxS@Kc+9&98rFx>SXqKmO#RcK7KUFe%p+3 zq8a0T5~B`w*bH`s8LZe$tG{HRyNNy_j;>5}kBNR+BKj}KjHI*U=--*>2kH!;RD2jU zSr8T~M$N;5YwCYh#YIsTQ zTS5c;$D01FoBZ)9seL$3Bdf6E&FuWii1{sD*uiFUMFP~cu?l;>i9R+Fy_JdnyEwX4 z*q@Oll^W=RPqV___%(&?dkKXdJyS86EX)=6}MEyH`W6ObEIN7Uo= zaF%ZsQz)WJL7q&u#D>;<_7?@A&&HUDe*ke@lD|G4{Vitn%XReIbo8@YMt_-(ep|&% ziT;&#M)We)98p&YZr#X{z5QflZ$e5gGo{nID+y``P-*H5+ezX>1@f&X9B&4D_wpRy z0cW7v%{DKV-{2`dz{E4K@;T{-xq*h1B`mocSY?I>mC8z4Y{N?Bcuj1X9~YZ8XXz?z zJRZjgQjg$cbqXyYR_%~>P@SingPeZs#tYHAfVYNirP~~&7B#s2TZ;QrL|L%X5N&E7 zc+$&XRCWgG26Ue&i%X;`w%|qUq_SiK^-$BbjxjxOd$QmWeMBGaw82fRiQqc`hgVdRU*xCzU5TSq9Kq5`qO2<2%&*hH50-AxpilWtW~K_3 zZqx1^{JMfq*J#IH@eF=&KsyeJgZTJx&>dbORH+!<9Rhr@kn~E$t-9*=%7&lDpz^-} z&Nui^AxiOo=168W+Cip*h#KRi5I<<h} zJf6Bb`o70~JXFc#O}i|%QH7$YMdeaoMN2Oi?VoS&@_P*3rGL1TJYC%%JehCe_t4VR zFYw6>`GQ$?<+?DwHXv3aj3m{ip-r!S!xj2cSx2t*J6RB z!cY(f+)wap8p5NTO!~zXF;vaMyS;iE1UQz=*W8h;86j|*u5jPvW}U3e#5^MH5bm3? z9zdAP+*j4>M0&PNgehCzyvY|vLyv95$t}%MPW98(6!r$6^qhLN5JyCPlSlGQ(mF5g z67w?F%8QWSZRg%$lYYE84a##{&|tEYd{x{Vr@<2- z#A&dD9Q{Ahpw6N}aC)64!}%@KfefO#1l=8ymc0EeG*M@L9;e9uF;HZ#Uno*%j3o~P zL9UQ)%RO>~EGOwJ@$6k7RA00BXX(o6_U&_zXB6u?=N2``k%fuO#0O& zhco81XCK|EhJiWSJJe~fd@s;!#jx|^EwZ-bMFiX1N$Olu4{hTbJ~YBIA+%|lI!MdW z+{ERmhD0go%Z6;FZU@M~XkPJwAWU;DOUHQ!Qgn@6@>n~XlCUOgtWYvotXe>f^0LFB zDz9oC^dG76*0l~Us;}}k2-|?S&tS(@*e(S19zo4NK%s|?!1*2hond77e5uL<>RILh z5wZ9yU-W87`%>0e5;>bXnT@$$>Sn6+tOM}1gP#UFW{2*w)#g!_h&wZr`=I1s4aPsr zO@oc7%{TO+8rNb%+XCMt1x_M+ye2s!4twCF-S1qJ933n!XW*n0S4y;(xVVYn#^r`} zh%23oSh!k6+XfC~1sbw+C_B-(UwK9A4Gb0J1P&+7Nediy`%(jkQ+!+)TH}aFLb+pk zQA{l%Q{r@AcO94DDnq$B$OQ!&Qs;XSsOY!A<(`I_j+ueEvxOpTF<|gXiGu;+BE;*yB_m-0;~r62MO*f>}%RYd#yPq zdSPgjVj_!0yI{FiEFH0o6iaI?my5-|<}3siHy%uH9g&vgKI*m~;{v2{-XQWWT!4fj zd?@r2gDFF5=quj+pa#ic<$nXpJ*SQDe54jq=ePpO;U6D%?n`X6MJJ_wL~qlrOXRP3 zMU+_N7|SKRR5W!K9;(QYM%Znhw5&t4tV&VKDDRvQvNycwD(?ZB;a(Klazne~fFK|9 z3vvy}IhW(SNh9l{9eH<$j25JCJenSy-LZJ@J<>F5l#_`~7z>SzuMu_26%?JOX{=Uc z$gjri!#LiOmT8^%op?(W+MMccgIpx!1eExRRAE=mtI+r*kWiKm?x-&Jvp)G=_{?)yXF zw8J;6LP^fnGBT>ROqZ;8QpNK+@ysu|d?uSon=ccPzg3m%He5;3OYsv|k#_Y^Pj-hY zH+2l<4G!k@35_Za=4I31! z-TWYBGuZ%N{5Q>1#3P!K&dNz2VAp3SZu@tz0W@!B>1HEefm1PmM>)JvihRnL?*F;= z4WbHd9=LUb#Ho(=GZUves+VOi1IF^gmaq_HxPy;^K9bD%A~4a{Vffyf;M+tE$Pjk= zUlKBCE=Qau9W}aUcC@64w*i`r7$%nkH6@aMRr>q%n#ZYCSsP-NiT1M$txf~%<{fs& zZFkB&>+xj_tTiS@%CSeZ?rBYwy67EuM8=d1^R6PNHvf$!qKgg{>FOMsGFPzk6DnBO ztyQRac}AT3n|17m-KTs*KviZ=9tN@s*?PCKd&bpb zpKzwVzRXx3WXtN|re9F0Ez|sZw~?#Wxj@GVR3`mu*A&rNHqV7^BDO}xE!|~aoQbR2 zbpyYzEE3-t*y^!W_?UHHyc1W+9Ok? z(A+J+z~z##pvYIFh(+BzP&Su3S9~N}d?ZhNBr|*@H+&>3e46LsQk{p>rODS`*e;E5&^`njS}cJ8H$1Fm|8u2hE@!Y z(pePcEFNUsf6-ggzmTfKn0QgXkjcbrlta_O%G~+o69>kYej~H4=fzH1m5G#YB#Ssl z)o68HLg||BCKw_w;k+a(mhAG0U0cM0);?vESRw{*(P6!d;BFaD>7K>iK>h=hD98I9 zMU0=rj2ugU&`?n4Zz=!_bc!p9_fyL05-*n#{ukhl9SMWGU>E zE_i6pGH}fs=ufF3q}{Fg-z7vSeO=Drb$ly~_;$*!N#YaM1-WU5b(4l&4W&j?Myvjd zr2g-=@i6NB8vU5L2If|4t3zPTjO_B{q7G;3BXCpMCj^Um(?W37qihW_1K0K4-nB9BZ(8KfI zl*w>vbD;osCV$s$6S4|d-96D7{^V<4G*)x~Ya0LCph2B%Q%R|9sE!OOQDVkQ1X*#5 zsG}udfmt_`b>&FY7%W+8pzPg3yL7Qajk| z_=+A3O3dCOl&mhhh@B%At24g!e7rM?Zrc@+vM#~_Bg0;HX-PKCS1-#djlS2*O zi#RLZb4OFOh%qR=u5|_FEj=aY5dM#+>8@;V=pzK98;{k5)3dKz4<+_i##<8XSqu$s zh88z80*Hi815_vwCr?X`7+8GU@`Y*}hN_N{?ae=R`C%rxX9c{AhI_KQg54hY{ zmb%;pn42+kFagYCn3pi?Fx8kEOfBXlruF?UcP6GU<_gTUm>HNqV(!DdkNFqoE6k4= z8)^Iwb2nxorW_Nh+EB+wdD-37-T*@oK%)Q#3E&z7kX8oZ0s#y$02u;kFMyr~poajG z1dw3>1__{!4Q6eM0mv1=egTL)1*uFFz-I#Z)&R^9zy|`@VF2zFz-j?R41mtZN&&oW z02T^{@KI`?HvnYnz5WW<;%LSI#C_mza? zlw9IIAW>}*zc3A+y`I!XHip#Y zXzF@GM*S^=^^#yYiNWd!COQELCcL6-33dfJ*41>DxN>mmI&zEad|a85wUbxi>L|K7 z{;mEg!++rs!XE-Us=S-X2|PxuasxgUb}*Me=KPK!;{a`rAjZXkY#=Br$RQp}pO!7g zA3agaR)}2)j-16zK5@VN{CsT}KkUME(rzkA3+qWZS|i~MxU3)Y^ZU=7+5etjONLhPMC@er z=plFAW%^6FxpSMs$z>10b6a>r#J9=6J9Zgfo`G<0VLIq@_aiO%r6>Wc51oW{P@cjG zKb!#7Lu!qwYH@$_1dfB6#`1|5$JEK8_;5{em&(Z%X8qz;Y~>Qg14ItE5OXU=$u_=TpIt4POP>nm#7rsBN|8gRJlZAq+gXwbj#SJCah`c()9SW zBn9;>`x}0tx#_Hf({!XPg)XG5<$1mO*yoNb&+E-criHxT$h1!A74BG=*7t08xzqlF zq+6cXua9f)MdIH#ti@g@^a*!-1gvzh!cMyc>R;|me?hVr%5#?6UXUDyOQrro14%98 z0(Sb^xncQ(F6Ps6_i*+5Zn2mzr9AlsDMxu;&ljX1g^7cW?(PdbO@oaVh~DrNQK(iB zZE9$RNJv*`SwA;~Y8JYO^!g!*p+)Z6lnneQ+g^eTq(a{@**dUAa6M?8YMYR_RNRKu zlK6v0XaQ7cIi^s{(0ZKwAThL5zA5#TZv+=eg_e;XOYjYq#B4}4Ue0j(f|jEHRA4%V zo&poOq(lN;C`FvyluBq@g}%8kn%!$6-bI4fzZss0@~ABEs$7?{X6aL0Mp9wjM2&H3 z;l@;}hPMD4$BaJNK5>VP56n}se^d~p(Sn&f+XhR;s3;a|9`;^rK921O||xC za4~uJ6DB2&gE#8XdasP;V3~i+Ma<0Q^x*@k@qFmkre$=xCZgRbXzLTv5;o{+AS&5j-z~nW=yPHs(y)jq(py5BR$v+{Rv)Zac z?V;CW8^G?IfXgl&Y_r{V_f3TpfXh}c&TKeK+f%uO-6L)@ zVBqi^US|W^V8^a^HiVRS7R_+lZt@w4qo0WlhM_s$^>vNGcU9Y&=XBMH`rS@7!skk% zEwBS0m_Xf7UPqq6<mHN`FUZg5ak>lAV5>eG9zt8{Aacv;A=q`C^WiQZ$$`O?7^ z`VE>2J|fKQ>!SXHRdk*)5*2vK#SdSLoO}efc=W9G4FddfI{DV|ZREI6@vY~3fbS8$HGB{8-Ntt>-z|K1@U7(gDc=gdoB6Kc`##@S z_`bvUIlglE`8Z$b9&>GDit?1oTl0a-cVLI=30>fM0Trmlx-xY)P$M~%QT`|s>;d9g zFZRn$;{GU z1-QHg@IC?Rb;MJ>u<7N(BVyBYe3{tvs$j9$^kT;+Hoa<^B{sd#oFTRwq_p>5ifxM6 z#sVvT_%V5I?G1XC^~!4r^&n!)$(Qp^pv>KUrGAp;jzME-h5Hc(pciS-*TeiHr#7EQ z6LCZO3OsHhMs;&72|P#-c(E8BZnbMRznM7IFsZfbdJ;_r8NIG%qI3kkugGC?mUV@! zv!#n1Abova8S12;Q*(FI-9M$mWwV!vX4p`t#w#gDT~`yH3Y-H$;1h)bUegSoFYw$e zfLAtyUn20w1^!AixLoJzq}l7sEqGg7N(qeQ$$a$E;AY`z-QHH-tbtDKOSN{9K&9Pc zDSg*bZpS%oZlNP=uj%fAzZ8WWziiI(b(0oeVvJg$JU4Gz^`ZG2BNsvgzyD=(t{+`3 zm4Sv1^9##Me)kv6#JPq~lKE$MBqhoDk~o(DUxv9Ea|gzciCz%SbE^;w=jb_N%P+v@ z5nGO0dMZym}rT1AktzWu={R)+~wZ)gkjcU--4;ZD9mY0NBnwW3NgRO z_%H#?a!ieBUf}yC=6%d3nA(eoo5orcl3VOW!K>W0oeYQuh}+e|{U3@=DMAz6q151L zcj#(oaCDl%F!~jA>lty^8qh$cQB_3LUL9rk(!8>KR9|gb997b5ul|%z9n2%cR`#N| zH_Lr=nvpg28hq4fJ`Pebg62xlp3X=N{V zJZZF#6FJg8hBBzoK4d!}%|rHBhoM~q#(kdIJbpH1&$x3V?;RX6E{L*?YCzloJ%#E! zwmDq4QR9RjHI6-ci-k5CVd`65O^ZUzYNt{WW-_}P7i?ViBMY!%=St&^Q)_&a6i)X|3>8sBx1>IiP%3k6+em=08tFpE{iXm#b5!G z(d!by=Hgd~Kx8>4_LoZfiva78D>1gnqApSv%ZsQa`IcacvCH=rjC2qA{sXhy{2t&d zaQXJ*EBNyL14iOWzJv{N?2u=!S=Yz`a(s6cqO>A)E4q|945LOCIFtO&p?` z+h}BH%;IHCIu#7G&-A*wSUuIEj)}8#vp6Ga(z&{hFMV3-xUpp&6X23&0b0~C{+*iq zBg!qYy-S@LwIM3Z@56M1it>E}^M(1XG2zY+lA&(BXD;LH`1PHDnh$0?kl!dr@%kXv zY$oVxK2o6WV387U+$IT&*{vs#dV=Z)i>D>hxga4ae}oC!^T5A(ypKWnI|_d3GYqhp z63q9{y4*KBkFxO>UGB7(T<$i1!@SD;^t#LaA?BZ$fp56nfA~AFcMKE6e)vsfyWVoS z8{g*3FojZ)R-XI(B!bQES$2oK6Q`^H^JjF?Bv$1 zb2|!HmG{G0ltwy9M(DTY-54Q-!JB2GPj@w@35b zwQ~O)mBsa9e;50HZ~gA;-79NfH|+bw{;XlIX_LN=%R+ww5;h>n$nHU7p&IZJ*Ovs- z4?J9`Btn(*5F;QuPH3;4`Z5(v#gCg~+=yFI`Af~Yl{)zm00rAsLPNM*4!!5O)R*n3 z%gT~6vXpK5TV5aGCGfO3oG=9W8*m-r&mD~jODpejsfU3|!M*}$(SN%jSY*DzAoD56 zVv)JvInK*4i!edV3e4XyA7Kh;C}O@$uv@UBz}n!KjTwfiy`6-hvP;GySl~LFHZlaj z%3I%Y?3$q2hCPAw?G1=U`gI?eq(2Ei9Pv6*RO=oT${!NSuVf=t zyC1KXg#QGXAu?Vw#YsjA0hh+3v3i;0ANk^MFw0GJrkf5>2_ci(WhgN z6a9UI=(8b`Mf8ucAIEfh!R5}v^udh4+<@s$&lIyb!EV8x1hy4(7?TE0Z9NmhZb-0) z`C3z+5i@WSVHv9i7JJMZ2y8d9zR3*nDj^CsHgp@hX$t27lR=Y0tdjd9M(=pSK-AR| zHtbd<1;d2vVT@!*)pErY`>+=m0 z<1sKqDW)2QkI(~Meep^y!yd0xdD@Nv%S$C#mHH(1PcervzhF{Ux!m0_zr)xVYQ;=V zuv;)cuvM6kG2dfqyOGd73Y1K4&RD6hwrNqRKX73~LhOJW-c+ggfhL9c-0;<%ErQ*s zU}oB2URv$jhNo4vb6zp4_Q~e(D>j%_dtWm+lB;U&-=u2yO4VleplW9r7-y{75r&`Y zO-9dHwVw%3HD0xyO!UUs>E>1YH_)VN>pe!n_cS3GReL`Ox@xzZ80*2%ReL8sLY4J+ zSpD@4?D48qM%89fT~^ilvA==&0&@`aA58Mg41Sm-W>7I#CD<+4jldqoY`}bjsU1N= z`|ql+xkRQG)tx+@v4Xd>Zc)K$&BFa~`gB4yuLM~Nq}nFLtt)$HB1CuO%|Mz}|Jp

fWE4Slt&k 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 W1m76iJNU)Rm{H>Wo$+9sc>fF5Eb>AC literal 0 HcmV?d00001 diff --git a/official/1.100/devtools/jpp.exe b/official/1.100/devtools/jpp.exe new file mode 100644 index 0000000000000000000000000000000000000000..95677ef222f2d8f0514201e05023b117959e51d1 GIT binary patch literal 123904 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

>jddu*9w@lQ!$t`lm~0skakr7Vzm8#?Rz_ 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Ŵ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

sG{%i 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�_NzYfTcdi&?*VnO{MM@T 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

b*oMK*io%$H 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�|y`!41I89-iu3 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 z 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

Contacting authors

+

+The JEDI Code Library is built upon donations by various individuals. In the +documentation for each subroutine or class you will find who the author of that +particular code is by looking in the "Quick Info" section. The author's e-mail +is not listed there. It is listed in the contributors page elsewhere in this +document. Therefore if you really need to contact an author it is possible. However, +generically speaking, you should never contact an author regarding code included +in this library. There are various reasons for this with the two most prominent +being that some authors explicitly requested this and because "author" means +different things in different context. Usually "author" means that the described +code was donated to the JCL by that individual and included after reformatting and +only minor modifications. However, sometimes code was significantly altered, +rewritten several times or 'merely' based upon or inspired by code from that +individual. Consequently there exist several routines which in no way resemble +the original code as it was donated by the "author". Nevertheless, the individual +that orginally donated the code is still documented as the author. +

+In general, if you like some routine very much and it has proven to work correctly: +be grateful to the author (in thought, not by sending him or her an e-mail). On +the other hand, if some routine turns out to be buggy, incorrect or for whatever +reason is not to your liking: complain to me. It was most likely we who screwed +it up and introduced those bugs into code that was working perfectly until we got +our hands on it! To report bugs, use Project JEDI's +Issue Tracker. + +

+ + \ No newline at end of file diff --git a/official/1.100/docs/Contributors.html b/official/1.100/docs/Contributors.html new file mode 100644 index 0000000..473dc92 --- /dev/null +++ b/official/1.100/docs/Contributors.html @@ -0,0 +1,199 @@ + + + + JCL Contributors (code donators) + + +

Contributors

+

+ Following is a list of all people that donated, or gave permission to use their, + code in the JEDI Code Library. Be sure that you read the Contacting Authors page + in the JCL helpfile before contacting these people. Note that JCL is continously + in development and by far not all donations have been processed yet. We're not + even half way! Therefore it is very well possible that you donated code but it's + not in the JCL yet. However, if you're name is not in the list below then it's + likely that something has gone wrong. In that event, please + contact us. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
aaAlan LloydAlex DenissovAlex Konshin
Alexander RadchenkoAlexei KoudinovAllan LyonsAnders Melander
André SnepvangersAndreas HausladenAndreas JakobscheAngus Johnson
Anthony SteeleAzret BotashBarry KellyBender Heri
Bernhard BergerBryan CoutchCarl ClarkCenon Del Rosario
Charlie CalvertChris MorrisClayton CollieCorrie Engelbrecht
Cybertron_549672Daniel MøllerDavid ButlerDavid Hervieux
Deian IvanovDewald HessDick Maley (Advanced Delphi Systems)Dylan Thomas
Earl F. GlynnEric S. FisherErnesto BenestanteESB Consultancy
Felipe de Toledo FariasFlier LuFlorent OuchetHallvard Vassbotn
Heinz ZastrauHelen BorrieHeri BenderHuanlin Tsai
Ivo BauerJack BombeeckJack N.A. BakkerJames Azarja
Jean DebordJean-Fabien ConnaultJean-Philippe BEMPELJeroen Speldekamp
Johannes BergJohn C MolyneuxJud McCranieJulien Ferraro
Kevin S. GallagherLasse Vågsæther KarlsenLeonard WennekersLiran Shahar
Lloyd KinsellaLucjan LukasikM.H. AvegaartMalcolm Edgar
Manlio LaschenaMarc ConventsMarcel BestebroerMarcel van Brakel
Marcin WieczorekMarco KlemmMario R. CarroMarius le Roux
Mark VaughanMartin KimmingsMartin KubeckaMassimo Maria Ghisalberti
Matt HamiltonMatthias ThomaMichael RynnMichael Schnell
Michael TsaiMichael WinterMike LischkeNick Hodges
Nils HaeckOliver SchneiderOlivier SannierPatrick van Laake
Pavel CisarPelle LiljendalPeter FriesePeter McMahon
Peter PaninoPeter ThörnquistPetr VonesPython
Ralf JunkerRaymond AlexanderRik BarkerRobert Lee
Robert MarquardtRobert R. MarshRobert RossmairRudy Velthuis
Scott PriceSouthEasterStefan KirschnerStephane Fillon
Sterling ButtsTheo BebekisTim YatesTom Hahn
Uwe SchusterWim De CleenYaniv GolanYour name here?
+

+

+

+

+ + diff --git a/official/1.100/docs/Contributors.txt b/official/1.100/docs/Contributors.txt new file mode 100644 index 0000000..51d4a95 --- /dev/null +++ b/official/1.100/docs/Contributors.txt @@ -0,0 +1,115 @@ +aa=aa@bitsmart.com +Alan Lloyd=alanglloyd@aol.com +Alex Denissov= +Alex Konshin=alexk@mtgroup.ru +Alexander Radchenko=ravnvt@chat.ru +Alexei Koudinov= +Allan Lyons= +Anders Melander= +André Snepvangers=asnepvangers@users.sourceforge.net +Andreas Hausladen=ahuser@users.sourceforge.net +Andreas Jakobsche=Jakobsche@addcom.de +Angus Johnson=ajohnson@rpi.net.au +Anthony Steele=asteele@iafrica.com +Azret Botash=azret@attglobal.net +Barry Kelly= +Bender Heri=HBender@Ergonomics.ch +Bernhard Berger=bernhardberger@yahoo.de +Bryan Coutch=oracle@bmts.com +Carl Clark=carl@caztec.co.za +Cenon Del Rosario=cenon@mail.com +Charlie Calvert=ccalvert@inprise.com +Chris Morris= +Clayton Collie= +Corrie Engelbrecht=sahfs@iafrica.com +Cybertron_549672=Cybertron_549672@yahoo.com +Daniel Møller=dj@sguft.com +David Butler=david@e.co.za +David Hervieux=dhervieux@Pirel.com +Deian Ivanov=deian@datecs.bg +Dewald Hess=dewaldh@emsoft.co.za +Dick Maley (Advanced Delphi Systems)=rmaley@fenix2.dol-esa.gov +Dylan Thomas=dylan@intelnet.net.gt +Earl F. Glynn=EarlGlynn@att.net +Eric S. Fisher= +Ernesto Benestante= +ESB Consultancy= +Felipe de Toledo Farias=ftfarias@dialdata.com.br +Flier Lu=flier@users.sourceforge.net +Florent Ouchet=ouchet.florent@laposte.net +Hallvard Vassbotn=hallvard.vassbotn@c2i.net +Heinz Zastrau=heinzz@users.sourceforge.net +Helen Borrie=helebor@wr.com.au +Heri Bender= +Huanlin Tsai= +Ivo Bauer=bauer@ozm.cz +Jack Bombeeck=Jack.Bombeeck@Onstream.com +Jack N.A. Bakker=jackb@europdonor.nl +James Azarja=support@jazarsoft.cjb.net +Jean Debord= +Jean-Fabien Connault= +Jean-Philippe BEMPEL=rdm_30@users.sourceforge.net +Jeroen Speldekamp= +Johannes Berg=johannes.berg@gmx.net +John C Molyneux=jaymol@hotmail.com +Jud McCranie=jud.mccranie@mindspring.com +Julien Ferraro=j.ferraro@netcourrier.com +Kevin S. Gallagher=gallaghe@teleport.com +Lasse Vågsæther Karlsen=lasse@cintra.no +Leonard Wennekers= +Liran Shahar=liran_shahar@hotmail.com +Lloyd Kinsella=lloydk@iname.com +Lucjan Lukasik=lucjanl@usa.net +M.H. Avegaart=mavegaart@csstelecom.nl +Malcolm Edgar=edgar@ccis.adisys.com.au +Manlio Laschena=manlio@users.sourceforge.net +Marc Convents= +Marcel Bestebroer=marcelb@zeelandnet.nl +Marcel van Brakel=brakelm@bart.nl +Marcin Wieczorek=wieczor@polbox.com +Marco Klemm=DonLuigi@gmx.net +Mario R. Carro=ochnap2@yahoo.com.ar +Marius le Roux=marius@caddie.co.za +Mark Vaughan= +Martin Kimmings= +Martin Kubecka= +Massimo Maria Ghisalberti=nissl@dada.it +Matt Hamilton=MHamilton@bunge.com.au +Matthias Thoma=mthoma@users.sourceforge.net +Michael Rynn=michrynn@ozemail.com.au +Michael Schnell=mschnell@bschnell.de +Michael Tsai=easyman@ms2.seeder.net +Michael Winter= +Mike Lischke=public@lischke-online.de +Nick Hodges=nhodges@icss.net +Nils Haeck=n.haeck@simdesign.nl +Oliver Schneider=assarbad@users.sourceforge.net +Olivier Sannier=obones@users.sourceforge.net +Patrick van Laake=patrick.vanlaake@ieee.org +Pavel Cisar=pcisar@atlas.cz +Pelle Liljendal=pelle.liljendal@firstconcern.com +Peter Friese=freter@gmx.net +Peter McMahon=fmcmp02@kc.kzn.school.za +Peter Panino=peter-panino@aon.at +Peter Thörnquist=peter3@users.sourceforge.net +Petr Vones=pvones@users.sourceforge.net +Python= +Ralf Junker=ralfjunker@gmx.de +Raymond Alexander=rayspostbox3@users.sourceforge.net +Rik Barker=rikbarker@users.sourceforge.net +Robert Lee=rhlee@nwu.edu +Robert Marquardt=marquardt@users.sourceforge.net +Robert R. Marsh=robmarsh@koit.fanz.net +Robert Rossmair=Robert.Rossmair@users.sourceforge.net +Rudy Velthuis=rvelthuis@gmx.de +Scott Price=scottprice@users.sourceforge.net +SouthEaster=anthony@southeaster.com +Stefan Kirschner=stefan_kirschner@01019freenet.de +Stephane Fillon=sfillon@ifrance.com +Sterling Butts=SterlingButts@Bigfoot.com +Theo Bebekis=bebekis@otenet.gr +Tim Yates=tim@things.demon.co.uk +Tom Hahn=tomhahn@users.sourceforge.net +Uwe Schuster=uschuster@users.sourceforge.net +Wim De Cleen=jones-jr@skynet.be +Yaniv Golan=ygolan@netvision.net.il diff --git a/official/1.100/docs/Experts.html b/official/1.100/docs/Experts.html new file mode 100644 index 0000000..9af3910 --- /dev/null +++ b/official/1.100/docs/Experts.html @@ -0,0 +1,160 @@ + + + + Jedi Code Library Release 1.100 + + + + + + +

+

Jedi Code Library

+

Release 1.100
+Build 2646
+30-May-2007

+

+

Content of this file

+ +

+

About experts

+

For Delphi 5, Delphi 6, Delphi 7, C++Builder 5 and C++Builder 6, experts can +be installed as design time packages or dll experts. For C#Builder 1 and Delphi 8, +experts are installed as dll experts (those products don't load design time +packages). For Delphi 2005, Borland Developer Studio 2006 and Turbo Delphi Professional, +experts are installed as design time packages.

+

Debug Extension for JclDebug unit

+

The experts\debug folder contains an IDE expert which +assists to insert JCL Debug information into executable files. This can be +useful when use source location routines from JclDebug unit. These routines +need some kind of special information to be able provide source location for +given address in the process. Currently there are four options to get it work:

+
    +
  1. Generate and deploy MAP file with your executable file. The file +is generated by the linker. It needs to be set in Project|Options +dialog -> Linker page, Detailed checkbox.
  2. +
  3. Generate and deploy JDBG file file with your executable file. +This is binary file based on MAP file but its size is typically about +12% of original MAP file. You can generate it by MapToJdbg tool in jcl\examples\windows\tools +folder. The advantage over MAP file is smaller size and better security +of the file content because it is not a plain text file and it also +contains a checksum. The IDE expert can automatically create this file +when the project is compiled (see below).
  4. +
  5. Insert JCL Debug info into executable file. The +size of added data is similar to JDBG file but it will be inserted +directly into the executable file. This is probably best option because +it combines small size of included data and no requirement of deploying +additional files. The IDE expert can automatically insert these informations +when the project is compiled (see below).
  6. +
  7. Generate Borland TD32 debug symbols. These symbols are stored +directly in the executable file but usually adds several megabytes so +the file is very large. The advantage is you don't have to deploy any +other file and it is easy to generate it by checking Include TD32 debug +info in Linker option page.
  8. +
+

+The IDE expert will add new item to IDE Project menu. For +Delphi 5, 6 and 7 it adds 'Insert JCL Debug data' check item at the end +of the Project menu. When the item is checked, everytime the project is +compiled by one of following commands: Compile, Build, Compile All Projects, +Build All Projects or Run necessary JCL debug data are automatically created +from the detailled MAP file. The behavior of this conversion can be customized in +the JCL options dialog (in the Tools menu of the IDE): the debug informations can +be exported as .jdbg files or inserted in the binary file. The expert outputs a +message in the IDE message view to display details about the data being generated.

+

+You can generate those debug data for packages and libraries as well +using the expert. Each executable file in the project can use different option +from those listed above. It is not necessary to generate any debug data for +Borland runtime packages because the source location code can use names of exported +functions to get procedure or method name. To get line number information for +Borland RTL and VCL/CLX units you have to check Use Debug DCUs checkbox in +Project|Options dialog -> Compiler tab. Unfortunately it is not +possible to get line number information for Borland runtime packages +because Borland does not provide detailed MAP files for them so you get +procedure or method name only.

+

In case you have more than one data source for an executable file by +an accident the best one is chosen in following order:

+
    +
  1. JCL Debug data in the executable file
  2. +
  3. JDBG file
  4. +
  5. Borland TD32 symbols
  6. +
  7. MAP file
  8. +
  9. DBG and PDB debug informations (for system DLLs)
  10. +
  11. Library or Borland package export tables
  12. +
+

It is also possible to create JCL debug data programmatically from a MAP file +by using MakeJclDbg command line tool in jcl\examples\windows\delphitools folder. +This utility can either export data as a separate .jdbg file or insert them in the +executable. You can study included makefiles which uses this tool for building +delphitools examples.

+

To help using JclDebug exceptional stack tracking in application +simple dialog is provided in jcl\experts\debug\dialogfolder. The dialog +replaces standard dialog displayed by VCL or CLX application when an unhandled +exception occurs. It has additional Detailed button showing the stack, list of +loaded modules and other system information. By adding the dialog to the +application exceptional stack tracking code is automatically initialized so you +don't have to care about it. You can also turn on logging to text file by setting +the Tag property of the dialog to '1'. There is also version for CLX +(ClxExceptDlg) but it works on Windows only. These dialogs are intended to be added to +Object Repository.

+

Short description of getting the JclDebug functionality in your +project:

+
    +
  1. Close all running instances of Delphi +
  2. +
  3. Install JCL and IDE experts by the JCL Installer +
  4. +
  5. Run Delphi IDE and open your project +
  6. +
  7. Remove any TApplication.OnException handlers from your project(if any). +
  8. +
  9. Add new Exception Dialog by selecting File | New | Other ... | +Delphi Projects | Delphi Files, Select 'JCL Exception Dialog for XXX' (where XXX is +either Delphi or C++Builder depending on your project). A wizard will appear to +configure the options for this dialog. +
  10. +
  11. Check "Project" | "Insert JCL Debug data" menu item +
  12. +
  13. Do Project | Build
  14. +
+

+

Version control expert

+

A new expert integrating version control systems in the IDE was added. +It provides an integration of TortoiseCVS and TortoiseSVN inside the IDE, items +are added in the IDE menu and buttons can be placed in IDE toolbars via the +customize dialog, see below.

+

A dialog-box provides configuration options for JCL experts in the Tools menu.

+

It wraps TortoiseCVS  +and TortoiseSVN commands in +actions that can be placed on IDE toolbars and in IDE menu.

+

This expert requires TortoiseCVS  +or/and TortoiseSVN installed on the +system to properly work. Please refer to these products documentations for help +about using version control systems.

+

The structure of the "Jcl Version" menu can be customized in the JCL options +dialog (in the "Tools" menu).

+

+

XMM debug window

+

This dialog provides enhancement to the debugger of Delphi and C++Builder regarding +XMM registers. These registers were introduced in SSE instructions (and are still +used in SSE2, SSE3 and SSSE3 instructions). This dialog can be displayed by clicking +on menu View | Debug Windows | SIMD (keyboard shortcut Ctrl+Alt+D). +It is divided in to panes following the style of the FPU window: the left pane +displays content of registers and the right pane displays MXCSR flags. The format +of the registers can be modified from the context. All registers and flags can be +modified and changes will be applied to the debugged process.

+

+

Favorite combobox in Open/Save dialogs

+

This expert modifies the IDE Open/Save dialogs and add a combobox to store your +favorite directories. Items can be added and deleted using the button at the right +of the combobox.

+ + + diff --git a/official/1.100/docs/MPL FAQ.html b/official/1.100/docs/MPL FAQ.html new file mode 100644 index 0000000..90cc6c2 --- /dev/null +++ b/official/1.100/docs/MPL FAQ.html @@ -0,0 +1,131 @@ + + + +MPL FAQ + + +

+ Mozilla Public License FAQ
+ Draft 1.0, 4/10/2000 +

+


+Please email Comments to Michael Beck
+For additional information, please also check the Official FAQ from Mozilla + +

Author perspective

+
    +
  1. Q: Do I retain copyright once I publish source under the MPL?
    + A: Absolutely. You still retain all your copyrights. +
  2. Q: Can I release the code under a different (possibly commercial type) license?
    + A: Yes. Since you have the original copyright, you can do it, but you can do + it only for your own code, and not for any contributions from others. +
  3. Q: In two years Acme, Inc. comes with a great new license, which I would love + to use. Am I always bound to MPL for my released code?
    + A: You can use a Dual License approach, i.e. you keep the code under MPL, and + you add another license, e.g. GPL. The user will have then the option to use + the one s/he prefers.
    + Or, as the Initial Contributor, with the original copyright, you can release + it under the other license. Please note: even if you release the code under + new license, users of your original MPL-released code can continue to use + under MPL as before. +
  4. Q: I think, JEDI could benefit from having cryptographic functions. I would + like to donate some (DES, Tripple DES etc.), which are covered by patent + rights (RSA, for example)? How should I do it?
    + A: All contributions are "Subject to third party intellectual property (IP) + claims." Thus, if you are aware of any patents infringements, before + submitting make sure that you: +
      +
    • secure the rights to use the IP in your contribution (e.g. by paying + a fee) +
    • modify the code so it doesn't infringe (in our case, provide other, + non-patented cryptographic functions) +
    • in a worst case scenario, if the two above are not possible, do not + submit the code +
    + Please note: different countries may have different patents laws. Therefore + in some countries it could be legal to use patented IP (e.g. because the + patent expired), while in others not. Check with your local Patent Office. +
+ +

User perspective

+
    +
  1. Q: Can I use the MPL code in commercial software? If yes, am I obligated to + credit the author?
    + A: Yes, you can use the MPL code in any commercial software. Since you have + to include the MPL code, the credit is included in the license header. + While not required, it is also customary to credit the author in "AboutBox". +
  2. Q: Must I release the source code of used components?
    + A: Only of those covered by MPL, together with any modifications to them. +
  3. Q: Must I publish my apps under MPL if I used MPL licensed code (the viral aspect) ?
    + A: No. That's the big advantage over GPL - you can use different code, mix MPL + and commercial code, but you don't have to release either the application, + nor the non-MPL code under MPL. Basically, what is MPL, will stay MPL, + but it doesn't have any impact on the non-MPL code. +
  4. Q: If a bug in MPL licensed code renders my clients machine unbootable, who + can I hold responsible for that?
    + A: Nobody. You use MPL licensed code at your own risk. Since it is provided + to you in a source code form, you can inspect it, test it, making sure that + it does, what you want it to do. +
  5. Q: Must I publish modifications to MPL licensed code?
    + A: Yes. This is one of the MPL requirements. You are getting a free source + code, but you have to publish all modifications to the code, unless you + have done the changes for your internal use. +
  6. Q: Must I publish code based on MPL licensed code under MPL?
    + A: Yes. You cannot change the license terms. Only the Initial Developer can + add an additional license (see dual license) +
  7. Q: If I subclass the MPL code, do I still have to publish the new code? After + all I didn't modify the code at all!
    + A: That's a tricky one. By the letter of the law, since you didn't touch the + original code, you might claim that it is a "new" code, therefore no need + for MPL. However, by the 'spirit of the law', Inheritance (or subclassing) + is a modification of the functionality of a given class, and as such a + "derived work", so even if you didn't touch the original code, you are + still making changes. +
  8. Q: I am proposing a modification to a JEDI-VCL component, which has a dual + license (MPL and GPL). This new file also needs to include a new class. + Should the source files for the new class be put in JEDI-VCL using MPL + with GPL dual-license or can it be put in another location and use only + the MPL?
    + A: The license of a file can't be changed without the consent of the copyright + owner. And a new file derived from an existing file inherits the licensing + from the existing file. In the case of this component, it has to stay MPL/GPL. +
  9. I am considering using an XML parser that has being covered by the MPL v1.1 + (or alternatively the GPL) in a commercial product. I will simply use the + DLL libraries without modification, including the necessary header files + in my own code. When I distribute (sell) my own product I would, of course, + need to distribute the DLL libraries as well. My questions are: +
      +
    1. Q1: Am I correct in assuming that simply including unmodified header + files and linking with a library covered by the MPL does not + place any legal restrictions or obligations on my commercial + product and its source code?
      + A1: It places no obligations on the code YOU wrote, but there are + still obligations for the code you included. These include + source distribution (for included MPL code, not YOUR code), + and some notification requirements. +
    2. Q2: Am I obligated to distribute the (unmodified) source code that + produced the libraries with which I link?
      + A2: Yes. Since you are shipping the DLL libraries with your product, + you have to make source available for the MPL code you ship.
      + Note that the license also allows you to meet the distribution requirement + by making the source available via electronic means rather than having to + physically ship them with your product (as long as you tell your users + where to get it). If you are using unmodified source code you could probably + just point at the code author's server. If you did that you'd have to + specify how users could get the exact version of the source you used, + such as a CVS date stamp or something.
      + This might be tricky -- you are responsible to make sure the source is + available for 12 months after you ship, and there's no way of knowing + how long the author will keep old versions around. The CVS repository + is more of a sure bet. You could, of course, host the source on your + own servers to be sure it'll stick around.
      + +
    3. Q3: Am I obligated to make my use of the particular libraries known + to users of my product?
      + A3: Yes, it's spelled out in the license. You need to credit the + source of copyrighted code that is not yours in both the product + and its documentation. +
    +
+ + diff --git a/official/1.100/docs/MPL-1.1.txt b/official/1.100/docs/MPL-1.1.txt new file mode 100644 index 0000000..7a45bfe --- /dev/null +++ b/official/1.100/docs/MPL-1.1.txt @@ -0,0 +1,470 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/official/1.100/docs/Readme.html b/official/1.100/docs/Readme.html new file mode 100644 index 0000000..a5a3755 --- /dev/null +++ b/official/1.100/docs/Readme.html @@ -0,0 +1,318 @@ + + + + Jedi Code Library Release 1.100 + + + + + +

+

Jedi Code Library

+

Release 1.100
+Build 2646 +30-May-2007

+

+

Content of this file

+ +

+

About this release

+

JCL release 1.100 provides an updated support for all targets (including CodeGear Delphi 2007 for Win32 and CodeGear C++Builder 2007).

+

As always, multiple bugs have been fixed; for detailed change logs, +use the facilities of our Subversion repository at Sourceforge.net  +http://sourceforge.net/projects/jcl/ +, see below.

+

Head changes: +

+
    +
  • JclPeImage is significantly updated: it now supports 64-bit applications and libraries. +
  • +
  • JclDebug is significantly updated: .jdbg files contain informations about all segments of code. A new option was added to limit exception handling to the main thread of the application. +
  • +
  • PCRE (http://www.pcre.org/) updated to version 7.0. PCRE code can be included in the application not requiring "pcre.dll" anymore (experimental - read the comments at the beginning of source\common\pcre.pas for details and modifications to enable this feature). +
  • +
  • JclMail : different file names can be specified for attachements +
  • +
  • Collection of stream classes to make basic operations easier (getting random data, multiplexing several streams, + buffering an other stream, being notifyed on changes, reading common data types, scoping a stream, delegating read/write/seek operations. +
  • +
  • Integration of the JCL help into the help system of Delphi 2005, BDS 2006, Turbo Delphi and Delphi 2007 for Win32. +
  • +
  • New IDE expert to have TortoiseSVN (http://tortoisesvn.tigris.org/) and TortoiseCVS (http://tortoisecvs.sourceforge.net/) commands integrated in all supportted IDE.
  • +
+

Important: +

+
    +
  • Note that the package naming has changed: the same package name is used by +all versions of the compiler supporting suffixes (C++Builder 6, Delphi 6, +Delphi 7, C#Builder 1, Delphi 8, Delphi 2005 and BDS 2006); a different suffix +is added for each target to the BPL file name (for BDS 2006, the library file is named jcl100.bpl). +The installer tries to remove old packages. 3rd party packages requiring old DJcl* resp. CJcl* packages need to be changed +to accomodate the new naming scheme or they will cause conflicts in the IDE at load time.

  • +
  • DCP files are now created in the lib\target subdirectory of the JCL +installation. 3rd party packages requiring JCL packages need to have this path +in their "browse path" option to compile.

  • +
+

(Windows only) Installation options:

+

Packages compiled by the JCL installer don't contain any debug +informations to keep their size as small as possible.

+

The Jedi Code Library packages are required by some 3rd party packages +(including the Jedi Visual Component Library - JVCL), the installer generates +them if the "Packages" node is checked.

+

The installer can generate MAP informations for each package. These informations +can be linked into binaries to become JCL debug data or be converted to .jdbg files. +Once linked MAP files could be deleted. These options are subnodes of the "Packages" node.

+

For BDS 2006, the compiler introduced a new option to make the same packages available in C++, +by checking the "Dual packages" option of the "Packages" node, you will be able to call functions +of the JCL from C++ code.

+

.net Framework support:

+

A subset of JCL units was worked over to support Delphi.Net (Delphi 2005 +& BDS 2006). The packages belong to the Jedi.Jcl namespace. The installer can generate these +packages for Delphi 2005 and BDS 2006, it displays an other tab to configure options and directory. +The installation process is similar to the native targets.

+

+

Supported Tools

+

The Jedi Code Library can be compiled and installed in the following environments

+

Only runtime support:

+ + +

Only design-time support (only experts):

+ +

Both supports (run time and design time):

+
    +
  • Delphi version 5, 6, 7. +
  • +
  • C++Builder version 5 & 6. +
  • +
  • Delphi 2005 (Delphi Win32 and Delphi.net personalities). +
  • +
  • Borland Developer Studio 2006 (Delphi Win32, C++ Builder Win32, Delphi.net and C#Builder personalities). +
  • +
  • Turbo Delphi (explorer and professional - cf Installation notes). +
  • +
  • CodeGear Delphi 2007 for Win32.
  • +
+

+

Installation notes

+
    +
  • Not every unit supports all tools. Look out for *.exc + files in the tool-specific lib/subdirectories for a list of units + excluded from compilation. +
  • +
  • Kylix 3 Delphi/C++ installation is back but specific code has not been tested with the latest + versions of the kernel. Please ensure you use the flavor of the JCL with Unix EOL. +
  • +
  • Free Pascal (http://www.freepascal.org/) + support has not been updated for this release; most units from + source/common should work with FP 2.0, as tests with a 2.0 beta (1.9.8) + indicated, but this has not been verified. Note that there are no plans + to support FP versions from the 1.0 branch.
  • +
+

Installation for Turbo Delphi

+

The Jedi Code Library can be compiled targetting Turbo Delphi Explorer and Turbo Delphi Professional. +Turbo Delphi Professional is recognized as BDS 2006, you have to download its command line compiler from +CodeGear website at http://www.codegear.com/Default.aspx?tabid=160  +to install the full JCL on this tool.

+

To install the JCL targetting Turbo Delphi Explorer, consider the following checks:

+
    +
  • If you have an other supported version of Delphi/C++Builder on this computer, it should automatically be + detected and the installer will process as usual. +
  • +
  • If you only have Turbo Delphi Explorer (and no other tools) on the computer, the installer cannot be + compiled. You have to use the Turbo Explorer flavor of the JCL that contains a precompiled installer. However, + you will not be able to install any experts.
  • +
+

Installation on C#Builder 1 and Delphi 8:

+
    +
  • These products cannot be used to build the JCL installer, you need an + other supported product to install JCL experts on these products. +
  • +
  • These products are not able to use the JCL library as a runtime library. + You cannot write managed applications and managed packages based on the JCL. +
  • +
  • These products are not shipped with their native compilers, you have to + download it from codecentral (http://cc.codegear.com/). + The item (http://codecentral.codegear.com/Download.aspx?id=21333) +  contains the native compiler to be installed in Delphi 8. + The item (http://codecentral.codegear.com/Download.aspx?id=21334) +  contains the native compiler to be installed in C#Builder 1. + These zip files have to be extracted in the products directory using the standard pattern:
  • +
+
		   Executable files (exe and dll)      - BDS\X.0\bin
+		   Compiler files (dcp and dcu)        - BDS\X.0\lib
+		   Toolsapi source files               - BDS\X.0\source\ToolsAPI
+
+

Default installation

+

For all others versions of Delphi, C++Builder and BDS, simply launch Install.bat +and the installer window will let you configure options and install the library.

+

+

Manual Installation

+

Although it is not recommended, a manual installation is possible. You will have +to manually configure options for the library. That is done by modifying an included +file. +

+

For each tool you want to install the JCL in, repeat the following steps:

+
    +
  1. Open and edit included file to customize options:
    • +
    • For Kylix 3 (Delphi): source\jclkd3.inc +
    • +
    • For Kylix 3 (C++Builder): source\jclkc3.inc +
    • +
    • For C++Builder 5: source\jclc5.inc +
    • +
    • For C++Builder 6: source\jclc6.inc +
    • +
    • For Delphi 5: source\jcld5.inc +
    • +
    • For Delphi 6: source\jcld6.inc +
    • +
    • For Delphi 7: source\jcld7.inc +
    • +
    • For Delphi 2005: source\jcld9.inc +
    • +
    • For Delphi.net 2005: source\jcld9.net.inc +
    • +
    • For BDS 2006 (Delphi and C++Builder) and CodeGear Delphi 2007 for Win32 : source\jcld10.inc +
    • +
    • For Delphi.net 2006: source\jcld10.net.inc
    • +
    +
  2. In the IDE, open and compile package Jcl.dpk (or Jcl.bpk for C++Builder) + located in a subdirectory of the "packages" directory matching your version of + the IDE. This package doesn't have to be installed since it doesn't provide + any components. +
  3. +
  4. If you want to install experts, open package JclBaseExpert.dpk and compile it, + then you can install all the experts you want (packages are located in the same + directory).
  5. +
+

+

Distribution content

+
Install.bat                   - Compile and run VCL version of the JCL Installer (Win32)
+QInstall.bat                  - Compile and run CLX version of JCL Installer (Win32)
+install.sh                    - Compile and run JCL Installer (Linux)
+bin                           - Common place for sample application EXE files
+lib                           - Common place for compiled units.
+docs                          - Readme (this file) and other documents
+docs\Readme.html              - This file
+docs\Experts.html             - Readme file about the experts
+docs\MPL-1.1.txt              - The Mozilla Public Licence (MPL) version 1.1
+docs\MPL FAQ.html             - Frequently Asked Questions about the MPL
+docs\cps.html                 - Cross Platform Strategy
+experts                       - JCL IDE experts source code
+experts\debug                 - JCL Debug IDE expert for using JclDebug unit
+experts\debug\dialog          - Application exception dialog replacement
+experts\debug\simdview        - Low-level debug window for XMM registers
+experts\debug\threadnames     - IDE expert showing class names for debugged threads
+experts\debug\tools           - Tools for creating files with JCL debug information
+experts\favfolders            - Favorite folders combobox in IDE open/save file dialogs
+experts\projectanalyzer       - Project Analyzer IDE expert
+experts\useswizard            - JCL uses wizard
+experts\versioncontrol        - Integration of TortoiseCVS and TortoiseSVN in the IDE
+examples                      - JCL example applications
+examples\common               - CLX and Win32 example applications in Delphi
+examples\dotnet               - JCL example applications for Delphi.net
+examples\windows              - JCL example applications for Delphi.Win32
+examples\windows\delphitools  - Collection of system tools using JCL
+help                          - Help file (distributed in a separate archive)
+install                       - Installer source code
+packages                      - JCL package sources
+source                        - JCL source code
+
+

+

Giving your feedback

+If you have any comments or suggestions we would appreciate it if you +drop us a note. There are several ways to get in contact with us: + +
+

Reporting bugs

+

The general rule is: If you want to get a +bug fixed you need to log it!

+

An issue tracking tool can be accessed via ('Code Library' category): +http://homepages.codegear.com/jedi/issuetracker/

+

Please be aware that you are allowed there to enter feature request and code donations as well.

+

The JEDI issue tracker is based up on the Mantis BugTracker Open +Source project. More background information about it is available on its homepage  +http://mantisbt.sourceforge.net

+

+

Downloads of stable sources

+

These sources are official JCL releases and file status can be considered as +stable for use in final applications. During the past years, there have been around 2 +or 3 releases per year.

+

Jedi Code Library: File List on SourceForge:  +http://sourceforge.net/project/showfiles.php?group_id=47514 +

+

+

Development sources

+

These files are under active development and may cause some incompatibilities +and some conflicts with existing code. You should not use these files in final +applications. The JCL development team provides these files for testing and +feedback from users.

+

You can download snapshots of the Subversion repository updated every day in the JCL daily page + http://jcl.sourceforge.net/daily/

+

To always have access to the most recent changes in the JCL, you +should install a Subversion client (we recommend TortoiseSVN http://tortoisesvn.tigris.org/ +and RapidSVN http://rapidsvn.tigris.org/) and download the +SVN repository files to your computer as explained in the repository page of the JEDI Wiki at +http://homepages.codegear.com/jedi/wiki/index.php?title=Repository  +With the SVN client, you can update your local repository at any time. +You can also view the repository online via the web interface at http://jcl.svn.sourceforge.net/

+

+

Getting involved in JCL development

+If you want to help out making JCL better or bigger or just plain +cooler, there are several ways in which you can help out. Here are some of the +things we need your help on: +
    +
  • Donate source code +
  • +
  • Donate time writing help +
  • +
  • Donate time writing demos +
  • +
  • Donate time fixing bugs
  • +
  • Share your experience by helping users in newsgroups and mailing lists
  • +
+

JCL accepts donations from developers as long as the source fullfills the +requirements set up by the JEDI and JCL teams. To read more about these +requirements, visit the page http://homepages.codegear.com/jedi/jcl

+

You can also donate your time by writing help for the source already +in JCL. We currently use Doc-o-Matic to create the finished help files but +the actual help sources are plain text files in a simple to understand format. +We can provide you with auto-generated templates with all classes, properties, +types etc already inserted. The "only" thing left to do is fill in the actual +help text for the help items. If you are interested in writing help, contact us.

+

If you want to help fix bugs in JCL, go to Mantis and check the bug report +there. You can post replies as well as fixes directly in the bug report. One of the +JCL developers will pick up the report/fix and update the Subversion repository if the fi +is satisfactory. If you report and fix a lot of bugs, you might even get developer +access to SVN so you can update the JCL files directly.

+ + diff --git a/official/1.100/docs/Readme.txt b/official/1.100/docs/Readme.txt new file mode 100644 index 0000000..3afd150 --- /dev/null +++ b/official/1.100/docs/Readme.txt @@ -0,0 +1,329 @@ +-------------------------------------------------------------------------------- + +Jedi Code Library +Release 1.100 +Build 2646 +30-May-2007 + +-------------------------------------------------------------------------------- + +Content of this file +About this release +Supported tools +Installation notes +Manual installation +Distribution content +Giving your feedback +Reporting bugs +Downloads of stable sources +Development sources +Getting involved in JCL development + +-------------------------------------------------------------------------------- + +About this release +JCL release 1.100 provides an updated support for all targets (including CodeGear +Delphi 2007 for Win32 and CodeGear C++Builder 2007). + +As always, multiple bugs have been fixed; for detailed change logs, use the +facilities of our Subversion repository at Sourceforge.net +http://sourceforge.net/projects/jcl/, see below. + +Head changes: + + - JclPeImage is significantly updated: it now supports 64-bit applications and + libraries. + - JclDebug is significantly updated: .jdbg files contain informations about all + segments of code. A new option was added to limit exception handling to the + main thread of the application. + - PCRE (http://www.pcre.org/) updated to version 7.0. PCRE code can be included + in the application not requiring "pcre.dll" anymore (experimental - read the + comments at the beginning of source\common\pcre.pas for details and + modifications to enable this feature). + - JclMail : different file names can be specified for attachements + - Collection of stream classes to make basic operations easier (getting random + data, multiplexing several streams, buffering an other stream, being notifyed + on changes, reading common data types, scoping a stream, delegating + read/write/seek operations. + - Integration of the JCL help into the help system of Delphi 2005, BDS 2006, + Turbo Delphi and Delphi 2007 for Win32. + - New IDE expert to have TortoiseSVN (http://tortoisesvn.tigris.org/) and + TortoiseCVS (http://tortoisecvs.sourceforge.net/) commands integrated in all + supportted IDE. + +Important: + + - Note that the package naming has changed: the same package name is used by + all versions of the compiler supporting suffixes (C++Builder 6, Delphi 6, + Delphi 7, C#Builder 1, Delphi 8, Delphi 2005 and BDS 2006); a different + suffix is added for each target to the BPL file name (for BDS 2006, the + library file is named jcl100.bpl). The installer tries to remove old + packages. 3rd party packages requiring old DJcl* resp. CJcl* packages need to + be changed to accomodate the new naming scheme or they will cause conflicts + in the IDE at load time. + + - DCP files are now created in the lib\target subdirectory of the JCL + installation. 3rd party packages requiring JCL packages need to have this + path in their "browse path" option to compile. + +(Windows only) Installation options: + + Packages compiled by the JCL installer don't contain any debug informations to +keep their size as small as possible. + + The Jedi Code Library packages are required by some 3rd party packages +(including the Jedi Visual Component Library - JVCL), the installer generates +them if the "Packages" node is checked. + + The installer can generate MAP informations for each package. These +informations can be linked into binaries to become JCL debug data or be +converted to .jdbg files. Once linked MAP files could be deleted. These options +are subnodes of the "Packages" node. + + For BDS 2006, the compiler introduced a new option to make the same packages +available in C++, by checking the "Dual packages" option of the "Packages" node, +you will be able to call functions of the JCL from C++ code. + +.net Framework support: + +A subset of JCL units was worked over to support Delphi.Net (Delphi 2005 +& BDS 2006). The packages belong to the Jedi.Jcl namespace. The installer can +generate these packages for Delphi 2005 and BDS 2006, it displays an other tab +to configure options and directory. The installation process is similar to the +native targets. + +-------------------------------------------------------------------------------- + +Supported Tools +The JCL can be compiled and installed in the following environments + +Only runtime support: + - Kylix 3 (cf Installation notes) + +Only design-time support (only experts): + - C#Builder 1 (cf Installation notes). + - Delphi 8.net (cf Installation notes). + +Both supports (run time and design time): + - Delphi version 5, 6, 7. + - C++Builder version 5 & 6. + - Delphi 2005 (Delphi Win32 and Delphi.net personalities). + - Borland Developer Studio 2006 (Delphi Win32, C++ Builder Win32, Delphi.net + and C#Builder personalities). + - Turbo Delphi (explorer and professional - cf Installation notes). + - CodeGear Delphi 2007 for Win32. + +-------------------------------------------------------------------------------- + +Installation notes + + - Not every unit supports all tools. Look out for *.exc files in the tool- + specific lib/subdirectories for a list of units excluded from compilation. + + - Kylix 3 Delphi/C++ installation is back but specific code has not been tested + with the latest versions of the kernel. Please ensure you use the flavor of + the JCL with Unix EOL. + + - Free Pascal (http://www.freepascal.org/) support has not been updated for + this release; most units fromsource/common should work with FP 2.0, as tests + with a 2.0 beta (1.9.8)indicated, but this has not been verified. Note that + there are no plans to support FP versions from the 1.0 branch. + +Installation for Turbo Delphi + +The Jedi Code Library can be compiled targetting Turbo Delphi Explorer and Turbo +Delphi Professional. Turbo Delphi Professional is recognized as BDS 2006, you +have to download its command line compiler from CodeGear website at +http://www.codegear.com/Default.aspx?tabid=160 to install the full JCL on this +tool. + +To install the JCL targetting Turbo Delphi Explorer, consider the following +checks: + + - If you have an other supported version of Delphi/C++Builder on this computer, + it should automatically be detected and the installer will process as usual. + - If you only have Turbo Delphi Explorer (and no other tools) on the computer, + the installer cannot becompiled. You have to use the Turbo Explorer flavor of + the JCL that contains a precompiled installer. However, you will not be able + to install any experts. + +Installation on C#Builder 1 and Delphi 8: + + - These products cannot be used to build the JCL installer, you need an other + supported product to install JCL experts on these products. + - These products are not able to use the JCL library as a runtime library. You + cannot write managed applications and managed packages based on the JCL. + - These products are not shipped with their native compilers, you have to + download it from codecentral (http://cc.codegear.com/). The item + (http://codecentral.codegear.com/Download.aspx?id=21333) contains the native + compiler to be installed in Delphi 8. The item + (http://codecentral.codegear.com/Download.aspx?id=21334) contains the native + compiler to be installed in C#Builder 1. These zip files have to be extracted + in the products directory using the standard pattern: + Executable files (exe and dll) - BDS\X.0\bin + Compiler files (dcp and dcu) - BDS\X.0\lib + Toolsapi source files - BDS\X.0\source\ToolsAPI + +Default installation + +For all others versions of Delphi, C++Builder and BDS, simply launch Install.bat +and the installer window will let you configure options and install the library. + +-------------------------------------------------------------------------------- + +Manual Installation +Although it is not recommended, a manual installation is possible. You will have +to manually configure options for the library. That is done by modifying an +included file. + +For each tool you want to install the JCL in, repeat the following steps: + +1. Open and edit included file to customize options: + - For Kylix 3 (Delphi): source\jclkd3.inc + - For Kylix 3 (C++Builder): source\jclkc3.inc + - For C++Builder 5: source\jclc5.inc + - For C++Builder 6: source\jclc6.inc + - For Delphi 5: source\jcld5.inc + - For Delphi 6: source\jcld6.inc + - For Delphi 7: source\jcld7.inc + - For Delphi 2005: source\jcld9.inc + - For Delphi.net 2005: source\jcld9.net.inc + - For BDS 2006 (Delphi and C++Builder) and CodeGear Delphi 2007 for Win32 : + source\jcld10.inc + - For Delphi.net 2006: source\jcld10.net.inc + +2. In the IDE, open and compile package Jcl.dpk (or Jcl.bpk for C++Builder) +located in a subdirectory of the "packages" directory matching your version of +the IDE. This package doesn't have to be installed since it doesn't provide any +components. + +3. If you want to install experts, open package JclBaseExpert.dpk and compile +it, then you can install all the experts you want (packages are located in the +same directory). + +-------------------------------------------------------------------------------- + +Distribution content +Install.bat - Compile and run VCL version of the JCL Installer (Win32) +QInstall.bat - Compile and run CLX version of JCL Installer (Win32) +install.sh - Compile and run JCL Installer (Linux) +bin - Common place for sample application EXE files +lib - Common place for compiled units. +docs - Readme (this file) and other documents +docs\Readme.html - This file +docs\Experts.html - Readme file about the experts +docs\MPL-1.1.txt - The Mozilla Public Licence (MPL) version 1.1 +docs\MPL FAQ.html - Frequently Asked Questions about the MPL +docs\cps.html - Cross Platform Strategy +experts - JCL IDE experts source code +experts\debug - JCL Debug IDE expert for using JclDebug unit +experts\debug\dialog - Application exception dialog replacement +experts\debug\simdview - Low-level debug window for XMM registers +experts\debug\threadnames - IDE expert showing class names for debugged threads +experts\debug\tools - Tools for creating files with JCL debug information +experts\favfolders - Favorite folders combobox in IDE open/save file dialogs +experts\projectanalyzer - Project Analyzer IDE expert +experts\useswizard - JCL uses wizard +experts\versioncontrol - Integration of TortoiseCVS and TortoiseSVN in the IDE +examples - JCL example applications +examples\common - CLX and Win32 example applications in Delphi +examples\dotnet - JCL example applications for Delphi.net +examples\windows - JCL example applications for Delphi.Win32 +examples\windows\delphitools - Collection of system tools using JCL +help - Help file (distributed in a separate archive) +install - Installer source code +packages - JCL package sources +source - JCL source code + +-------------------------------------------------------------------------------- + +Giving your feedback + +If you have any comments or suggestions we would appreciate it if you drop us a +note. There are several ways to get in contact with us: + - Newsgroup is the recommended way to contact other JCL users and the team + itself. They are hosted at news://forums.talkto.net/jedi.jcl. + - Write to jcl@delphi-jedi.org or to jcl-testing@delphi-jedi.org This email + account should not be used for support requests. If you need support please + use either the newsgroups or the mailing list. + - If you want to keep up to date about JCL then you can join the JCL mailing + list by going to http://tech.groups.yahoo.com/group/JEDI-JCL/You can also use + this list to voice your opinion, comments or suggestions. + +-------------------------------------------------------------------------------- + +Reporting bugs + +The general rule is: If you want to get a bug fixed you need to log it! + +An issue tracking tool can be accessed via ('Code Library' category): +http://homepages.codegear.com/jedi/issuetracker/ + +Please be aware that you are allowed there to enter feature request and code +donations as well. + +The JEDI issue tracker is based up on the Mantis BugTracker Open Source project. +More background information about it is available on its homepage +http://mantisbt.sourceforge.net + +-------------------------------------------------------------------------------- + +Downloads of stable sources + +These sources are official JCL releases and file status can be considered as +stable for use in final applications. During the past years, there have been +around 2 or 3 releases per year. + +Jedi Code Library: File List on SourceForge: +http://sourceforge.net/project/showfiles.php?group_id=47514 + +-------------------------------------------------------------------------------- + +Development sources + +These files are under active development and may cause some incompatibilities +and some conflicts with existing code. You should not use these files in final +applications. The JCL development team provides these files for testing and +feedback from users. + +You can download snapshots of the Subversion repository updated every day in the +JCL daily page http://jcl.sourceforge.net/daily/ + +To always have access to the most recent changes in the JCL, you should install +a Subversion client (we recommend TortoiseSVN http://tortoisesvn.tigris.org/and +RapidSVN http://rapidsvn.tigris.org/) and download the SVN repository files to +your computer as explained in the repository page of the JEDI Wiki at +http://homepages.codegear.com/jedi/wiki/index.php?title=Repository With the SVN +client, you can update your local repository at any time. You can also view the +repository online via the web interface at http://jcl.svn.sourceforge.net/ + +-------------------------------------------------------------------------------- + +Getting involved in JCL development + +If you want to help out making JCL better or bigger or just plain cooler, there +are several ways in which you can help out. Here are some of the things we need +your help on: + - Donate source code + - Donate time writing help + - Donate time writing demos + - Donate time fixing bugs + - Share your experience by helping users in newsgroups and mailing lists + + JCL accepts donations from developers as long as the source fullfills the +requirements set up by the JEDI and JCL teams. To read more about these +requirements, visit the page http://homepages.codegear.com/jedi/jcl + + You can also donate your time by writing help for the source already in JCL. +We currently use Doc-o-Matic to create the finished help files but the actual +help sources are plain text files in a simple to understand format. We can +provide you with auto-generated templates with all classes, properties, +types etc already inserted. The "only" thing left to do is fill in the actual +help text for the help items. If you are interested in writing help, contact us. + +If you want to help fix bugs in JCL, go to Mantis and check the bug report +there. You can post replies as well as fixes directly in the bug report. One of +the JCL developers will pick up the report/fix and update the Subversion +repository if the fi is satisfactory. If you report and fix a lot of bugs, you +might even get developer access to SVN so you can update the JCL files directly. + diff --git a/official/1.100/docs/ThreadSafe.txt b/official/1.100/docs/ThreadSafe.txt new file mode 100644 index 0000000..76c881c --- /dev/null +++ b/official/1.100/docs/ThreadSafe.txt @@ -0,0 +1,28 @@ +------------------------------------------------------------------------------ +Jedi Code Library +HomePage: http://jcl.sourceforge.net/ +------------------------------------------------------------------------------ + +Thread safe support + +Some pieces of code can handle read/write accesses from multiples threads +without writing specific code. +This support can be enabled: +- by defining the THREADSAFE compiler symbol {$DEFINE THREADSAFE} when JCL + units are part of a project. +- by checking the “Enable thread safe code” node in the installer options + +Presently only the following units have some pieces of code that implicitly +handles thread safe accesses: +source\common\JclAbstractContainers.pas +source\common\JclArrayLists.pas +source\common\JclArraySets.pas +source\common\JclBinaryTrees.pas +source\common\JclHashMaps.pas +source\common\JclLinkedLists.pas +source\common\JclQueues.pas +source\common\JclStacks.pas + +This support is made using critical sections, if you want other piece of code +to be thread safe, please create a feature request in the “Code Library” category +of the mantiss at http://homepages.borland.com/jedi/issuetracker/ diff --git a/official/1.100/docs/cps.html b/official/1.100/docs/cps.html new file mode 100644 index 0000000..dc00e61 --- /dev/null +++ b/official/1.100/docs/cps.html @@ -0,0 +1,655 @@ + + + + + Jedi Code Library - Cross Platform Strategy + + +

Jedi Code Library - Cross Platform Strategy

+

+This paper presents the JCL teams strategy for cross platform +compliance of the +Jedi Code Library. It is based up on the discussions within the JCL +newsgroup +and JCL developer mailing lists. This document is currently work in +progress +and subject to changes with or without notice. +

+

+Version history:
+    0.1 Initial release +

+

+

+

Background

+

+The main objective is to make the Jedi Code Library VisualCLX (Kylix +for Delphi/Delphi) and Delphi.NET compatible. For a detailed +explanation of the currently used terminology, see the following +article +Overview of the VCL for .NET.

+

+We have to cope with nearly all aspects of cross platform progamming, +like different APIs, different operating system concepts etc. Since we +want to be as crossplatform compatible as possible interface +compatability is the most important +issue for us. Jedi Code Library users should have to opportunity the +use the JCL +on whatever platform they like. Figure 1 shows the three basic layers +we have to deal with: +

+
    +
  • Platform independent layer: Units which are not (or only very +minor) +platform specific and do not depend on a specific component set. This +doesn't mean that units in this layer have to consist of no platform +dependent code, but they have to +be nearly 100% interface compatible and all functionality must have +been ported to all +supported platforms.
  • +
  • Platform dependent layer: Units which depend on a specific +platform (e.g. JclCLI)
  • +
  • Component set dependent layer: Units which depend on a specific +component set
  • +
+

+
+Fig 1: The Jedi Code Library crossplatform layer structure +

+

+The Jedi Code Library currently targets the following platforms: +

+
    +
  • Kylix for Delphi (Kylix 3) / Linux
  • +
  • Delphi (Version 5,6,7) / Microsoft Windows
  • +
+and is trying to support the following platforms as soon as possible: +
    +
  • Delphi .NET / .NET (Micrsoft Windows)
  • +
+

+As a mid or long term perspective we are hoping to get the JCL +FreePascal compatible. +This involves the possibilty to have the JCL running on DOS, OS/2, +FreeBSD and +AmigaOS.

+

Common platform independent layer

+

+This layer consists of all files which are not platform dependent or +need only very minor adjustations. Furthermore all units in this layer +do not depend on a +specific component set. Examples for common platform independent units +are JclBase, JclDateTime, JclFileUtils and JclMath. The units have been +ported to all platforms and are the crossplatform "core" of the Jedi +Code Library. As a general rule a unit in this layer should have no +platform specific ifdefs in its +interface section. +

+

Platform dependent layer

+

+Furthermore we do not have to differentiate between VCL and VisualCLX +units only (the so called component set dependent layer), but also +between UNIX, Windows and .NET dependent units. The platform dependent +units doesn't need to be interface compatible (if there is an +equivalent in one of the other suported platforms at all!). +An example for a platform dependent unit is JclCLI. Nonetheless if +there are equivalents in all other supported platforms as well it might +be considerable to write a more general class and include that unit +into the common platform indepedant layer. +

+

Component set dependent layer

+

+When it comes to sharing code between VCL and VisualCLX-applications, +some facts need to be stated: +

+

+

+
  • A unit is called VCL-dependent, when it uses some +VCL-unit(s), e.g. Graphics. +
  • +
  • A unit is called VisualCLX-dependent, when it uses some +VisualCLX-unit(s), e.g. QGraphics.
  • +

    +When a unit contains neither VCL- nor VisualCLX-specific code, there is +no problem: It can be used by either type of application. +

    +

    +While it is basically possible to create VCL-dependent and +VisualCLX-dependent +variants of the same unit by means of conditional compilation - and use +them in +VCL- and VisualCLX-applications respectively -, this method fails at +design time: +One and the same unit cannot be installed twice in the IDE, not even as +part of +different packages. We would have to rename one of the variants, +effectively +creating a new unit. Therefor we will use a preprocessor to resolve the +conditional compilation symbols related to VCL/VisualCLX-specific code +and create +VCL/VisualCLX units from a common codebase. +

    +

    +Component dependent units should be largely "interface compatible" - +interface +adjustments for specific component sets are unavoidable - nonetheless +similar +interfaces are desirable. +

    +

    Preprocessor

    +

    +The preprocessor jpp is a modified version of Barry Kelly's ppp tool. +In contrast to ppp, which resolves all conditional compilation +directives without exception, with jpp symbols not only can be defined +but also undefined. Those symbols which are neither defined nor +explicitely undefined are considered +as of unknown status and it and its related source code remains +untouched. +

    +

    +The usage of jpp is not too hard. It is called via +

    +
    jpp [options] <input files>...
    +Possible options are +
      -i       Process includes
    -c Process conditional directives
    -C Strip comments
    -pxxx Add xxx to include path
    -dxxx Define xxx as a preprocessor conditional symbol
    -uxxx Assume preprocessor conditional symbol xxx as not defined
    -x[n:]yyy Strip first n characters from file name; precede filename by prefix yyy
    +

    +The example command line below generates a file JclQGraphics.pas in +subdirectory +CLX from file Graphics.cb located in the current directory. Symbols +"VisualCLX" +and "COMPILER6_UP" are specified as defined, "Bitmap32" and "VCL" as +undefined. +

    +
      jpp -c -dVisualCLX -dCOMPILER6_UP -uBitmap32 -uVCL -xCLX\JclQ Graphics.cb
    +

    Generating Jcl[Q]Graphics.pas and Jcl[Q]GraphUtils.pas

    +

    +First compile Preprocessor\jpp.exe from Preprocessor\jpp.dpr. +Then change to the "Source" directory and type "make" at the command +line. +This will create the units
    +VCL\JclGraphics.pas
    +VCL\JclGraphUtils.pas
    +CLX\JclQGraphics.pas
    +CLX\JclQGraphUtils.pas
    +

    +

    +from their prototypes _Graphics.pas and _GraphUtils.pas. +

    +

    Minimizing VCL dependencies

    +

    +To reduce VCL dependencies in JCL, the following changes have been +made: +

    + +
    +
    JclFileUtils
    +
    PathCompactPath is an overloaded function. The variant which +takes a TCanvas as argument (and thus creates a dependency on VCL unit +Graphics) has been removed.
    +
    +
    +
    +
    JclShell
    +
    ShellLinkGetIcon has been removed. It could get part of some +genuine VCL-dependent unit (e.g. JclGraphUtils), but for now it is left +out.
    +
    +
    +
    +
    JclPEImage
    +
    +
     Replace "uses Consts," by

    uses
    {$IFDEF COMPILER6_UP}
    RtlConsts, // VisualCLX-package compatible (part of rtlxx.bpl)
    {$ELSE}
    Consts, // not VisualCLX-package compatible (part of vclxx.bpl)
    {$ENDIF COMPILER6_UP}
    +
    +
    +
    +

    +Note that the first two changes have enormous impact, since many JCL +units use JclFileUtils and JclSysInfo (which both use JclShell). This +leaves JclGraphics and JclGraphUtils as sole units with genuine +VCL/VisualCLX-dependencies. +JclPrint is the only remaining pure VCL-dependent units.

    +

    New directory structure

    +

    +With the new JCL release we introduce a more appropriate source file +directory +structure. The files are now grouped according their respective layers. +

    +
    Source/
    Common
    DotNet
    Unix
    VCL
    VisCLX
    Windows
    +

    Status - Platforms

    +

    +This table gives a short overview of which units are already working +under four different Delphi language compilers/platforms. There are +four status levels possible: +

    +

    + + + + + + + + + + + + + + + + + + + +
    +
    +
      the unit has been ported to that platform
    -  the unit has not been ported to that platform
     (+) +
    +
      the unit compiles, but not all of its functionality +has been ported to that platform.
     platform +
    +
      the unit is platform dependent and will not be ported.
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDelphi +(Windows)Kylix +for DelphiDelphi.NETFree +Pascal
    Jcl8087++-?
    JclAppInst+--?
    JclCil+--?
    JclClr+--?
    JclCom+--?
    JclComplex++-?
    JclConsole+--?
    JclCounter++-?
    JclDateTime+(+)-?
    JclDebug+--?
    JclDotNet+--?
    JclEDI++-?
    JclEDISEF++-?
    JclEDIXML++-?
    JclEDI_ANSIX12++-?
    JclEDI_UNEDIFACT++-?
    JclFileUtils+(+)-?
    JclExprEval++
    +
    -?
    JclHookExcept+--?
    JclIniFiles++
    +
    -?
    JclLanMan+--?
    JclLocales+--?
    JclLogic++-?
    JclMapi+--?
    JclMath++-?
    JclMetaData+--?
    JclMidi+--?
    JclMime++-?
    JclMiscel+--?
    JclMultimedia+--?
    JclNTFS+--?
    JclPEImage+--?
    JclPrint+--?
    JclStrHashMap++
    +
    -?
    JclStatistics++-?
    JclShell+--?
    JclSecurity+--?
    JclSchedule++-?
    JclRTTI+--?
    JclResources+--?
    JclRegistry+--?
    JclStrings++-?
    Jclsvcctrl+--?
    Jclsynch+--?
    JclTaskplatform--?
    JclSysUtils+(+)
    +
    -?
    JclSysInfo+(+)
    +
    -?
    JclTD32+--?
    JclUnicode+--?
    JclUnitConv++-?
    JclWin32platform --?
    JclWinMidiplatform --?
    +

    Assembler

    +

    +For crossplatform compatability it is absolutely necessary to reduce +the amount +of inline assembler code used. Therefore as a general rule every line +of assembler +must have a pure pascal pendant. Please use assembler only if it +really has a noticeable impact on the libraries performance.

    +
    {$IFNDEF PUREPASCAL}
    // assembler code here
    {$ELSE}
    // Delphi equivalent here
    {$ENDIF}
    +

    Packages

    + + diff --git a/official/1.100/docs/cps_files/strucv1.jpg b/official/1.100/docs/cps_files/strucv1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c2fddc232b5c7156166c1451cc41e49271f5c2e GIT binary patch literal 33442 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 f$D}lpuhFQtQF8Dm75;uA + + + + + + + + + + + + windows\debug\stacktrack\StackTrackDLLsExample.bdsproj + windows\debug\stacktrack\StackTrackDLLsStaticLibrary.bdsproj + windows\debug\stacktrack\StackTrackDLLsDynamicLibrary.bdsproj + windows\debug\stacktrack\StackTrackDLLsComLibrary.bdsproj + windows\debug\stacktrack\StackTrackExample.bdsproj + StackTrackDLLsExample.exe StackTrackDLLsStaticLibrary.dll StackTrackDLLsDynamicLibrary.dll StackTrackDLLsComLibrary.dll StackTrackExample.exe + + + + diff --git a/official/1.100/examples/JclDebugExamples.bpg b/official/1.100/examples/JclDebugExamples.bpg new file mode 100644 index 0000000..fbf9f71 --- /dev/null +++ b/official/1.100/examples/JclDebugExamples.bpg @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = StackTrackDLLsExample.exe StackTrackDLLsStaticLibrary.dll \ + StackTrackDLLsDynamicLibrary.dll StackTrackDLLsComLibrary.dll StackTrackExample.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +StackTrackDLLsExample.exe: windows\debug\stacktrack\StackTrackDLLsExample.dpr + $(DCC) + +StackTrackDLLsStaticLibrary.dll: windows\debug\stacktrack\StackTrackDLLsStaticLibrary.dpr + $(DCC) + +StackTrackDLLsDynamicLibrary.dll: windows\debug\stacktrack\StackTrackDLLsDynamicLibrary.dpr + $(DCC) + +StackTrackDLLsComLibrary.dll: windows\debug\stacktrack\StackTrackDLLsComLibrary.dpr + $(DCC) + +StackTrackExample.exe: windows\debug\stacktrack\StackTrackExample.dpr + $(DCC) + + diff --git a/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dof b/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dof new file mode 100644 index 0000000..c22fe7f --- /dev/null +++ b/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=..\..\..\..\bin diff --git a/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dpr b/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dpr new file mode 100644 index 0000000..6777a41 --- /dev/null +++ b/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.dpr @@ -0,0 +1,21 @@ +program AlgorithmsExample; + +{$I jcl.inc} + +uses + {$IFDEF MSWINDOWS} + Forms, + {$ENDIF MSWINDOWS} + {$IFDEF LINUX} + QForms, + {$ENDIF LINUX} + AlgorithmsExampleMain in 'AlgorithmsExampleMain.pas' {MainForm}; + +{$R *.res} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.res b/official/1.100/examples/common/containers/algorithms/AlgorithmsExample.res new file mode 100644 index 0000000000000000000000000000000000000000..b111060100a5f025f8352346a52aa105dda315dc GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tVP#TUMl38+L=gfOYT+L^n{Cnvf+wW#s%rxNnLu)|%~k%6 zl$I$|i0j+gyL{lskhe2$=FRS8xdnhO;amX29sAg;>k&0dYOR)T)S?pxUE+dJsM75D z-7YQoTL`ZNskJunM9$J{ZiL4pI|=o`jj8rCvcaPY5Pj=~+s-6tVP#TUMl38+L=gfOYT+L^n{Cnvf+wW#s%rxNnLu)|%~k%6 zl$I$|i0j+gyL{lskhe2$=FRS8xdnhO;amX29sAg;>k&0dYOR)T)S?pxUE+dJsM75D z-7YQoTL`ZNskJunM9$J{ZiL4pI|=o`jj8rCvcaPY5Pj=~+s-6tVP#TUMl38+L=gfOYT+L^n{Cnvf+wW#s%rxNnLu)|%~k%6 zl$I$|i0j+gyL{lskhe2$=FRS8xdnhO;amX29sAg;>k&0dYOR)T)S?pxUE+dJsM75D z-7YQoTL`ZNskJunM9$J{ZiL4pI|=o`jj8rCvcaPY5Pj=~+s-6tVP#TUMl38+L=gfOYT+L^n{Cnvf+wW#s%rxNnLu)|%~k%6 zl$I$|i0j+gyL{lskhe2$=FRS8xdnhO;amX29sAg;>k&0dYOR)T)S?pxUE+dJsM75D z-7YQoTL`ZNskJunM9$J{ZiL4pI|=o`jj8rCvcaPH zw}#sXE`7EbIFDpIb#6}v9yjfDlBP%o19|49(ZGhr6B!J(*nuV@^2z&n=roW6tsUr%_nXEYDeJ+zJ}zBDJ*ENaTCN`(QK!U-XoBWO_1g$cV)PRiHYe3snuv z@IsfH(B%fcE@K@2G61`V`!)PwP8=He_cHA2`NgGHdad1ksNI)9Z(cs8^oR(FbD|@D p5InR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/expreval/ExprEvalExampleLogic.pas b/official/1.100/examples/common/expreval/ExprEvalExampleLogic.pas new file mode 100644 index 0000000..7c258ec --- /dev/null +++ b/official/1.100/examples/common/expreval/ExprEvalExampleLogic.pas @@ -0,0 +1,105 @@ +unit ExprEvalExampleLogic; + +interface + +uses + SysUtils, Classes, JclExprEval; + +procedure Init(Evaluator: TEasyEvaluator; FuncList: TStrings); +function ResultAsText(Evaluator: TEvaluator; const Input: string): string; + +implementation + +uses + JclMath; + +procedure Init(Evaluator: TEasyEvaluator; FuncList: TStrings); +begin + with Evaluator do + begin + // Constants + AddConst('Pi', Pi); + + // Functions + AddFunc('LogBase10', LogBase10); + AddFunc('LogBase2', LogBase2); + AddFunc('LogBaseN', LogBaseN); + AddFunc('ArcCos', ArcCos); + AddFunc('ArcCot', ArcCot); + AddFunc('ArcCsc', ArcCsc); + AddFunc('ArcSec', ArcSec); + AddFunc('ArcSin', ArcSin); + AddFunc('ArcTan', ArcTan); + AddFunc('ArcTan2', ArcTan2); + AddFunc('Cos', Cos); + AddFunc('Cot', Cot); + AddFunc('Coversine', Coversine); + AddFunc('Csc', Csc); + AddFunc('Exsecans', Exsecans); + AddFunc('Haversine', Haversine); + AddFunc('Sec', Sec); + AddFunc('Sin', Sin); + AddFunc('Tan', Tan); + AddFunc('Versine', Versine); + AddFunc('ArcCosH', ArcCosH); + AddFunc('ArcCotH', ArcCotH); + AddFunc('ArcCscH', ArcCscH); + AddFunc('ArcSecH', ArcSecH); + AddFunc('ArcSinH', ArcSinH); + AddFunc('ArcTanH', ArcTanH); + AddFunc('CosH', CosH); + AddFunc('CotH', CotH); + AddFunc('CscH', CscH); + AddFunc('SecH', SecH); + AddFunc('SinH', SinH); + AddFunc('TanH', TanH); + end; + with FuncList do + begin + Add('LogBase10'); + Add('LogBase2'); + Add('LogBaseN'); + Add('ArcCos'); + Add('ArcCot'); + Add('ArcCsc'); + Add('ArcSec'); + Add('ArcSin'); + Add('ArcTan'); + Add('ArcTan2'); + Add('Cos'); + Add('Cot'); + Add('Coversine'); + Add('Csc'); + Add('Exsecans'); + Add('Haversine'); + Add('Sec'); + Add('Sin'); + Add('Tan'); + Add('Versine'); + Add('ArcCosH'); + Add('ArcCotH'); + Add('ArcCscH'); + Add('ArcSecH'); + Add('ArcSinH'); + Add('ArcTanH'); + Add('CosH'); + Add('CotH'); + Add('CscH'); + Add('SecH'); + Add('SinH'); + Add('TanH'); + end; +end; + +function ResultAsText(Evaluator: TEvaluator; const Input: string): string; +begin + try + Result := FloatToStr(Evaluator.Evaluate(Input)); + except + on E: Exception do + Result := E.Message; + end; +end; + + +end. diff --git a/official/1.100/examples/common/expreval/ExprEvalExampleMain.dfm b/official/1.100/examples/common/expreval/ExprEvalExampleMain.dfm new file mode 100644 index 0000000..7b67763 --- /dev/null +++ b/official/1.100/examples/common/expreval/ExprEvalExampleMain.dfm @@ -0,0 +1,71 @@ +object Form1: TForm1 + Left = 222 + Top = 107 + ClientWidth = 479 + ClientHeight = 321 + Caption = 'JclExprEval Example' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 12 + Top = 12 + Width = 54 + Height = 13 + Caption = 'E&xpression:' + FocusControl = ExpressionInput + end + object Label2: TLabel + Left = 12 + Top = 40 + Width = 49 + Height = 13 + Caption = 'Functions:' + end + object ExpressionInput: TEdit + Left = 80 + Top = 8 + Width = 305 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end + object Memo1: TMemo + Left = 0 + Top = 60 + Width = 479 + Height = 270 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 1 + end + object EnterButton: TButton + Left = 396 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Evaluate' + Default = True + TabOrder = 2 + OnClick = EnterButtonClick + end + object FuncList: TComboBox + Left = 80 + Top = 36 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + Sorted = True + TabOrder = 3 + OnClick = FuncListClick + end +end diff --git a/official/1.100/examples/common/expreval/ExprEvalExampleMain.pas b/official/1.100/examples/common/expreval/ExprEvalExampleMain.pas new file mode 100644 index 0000000..ec090c4 --- /dev/null +++ b/official/1.100/examples/common/expreval/ExprEvalExampleMain.pas @@ -0,0 +1,67 @@ +unit ExprEvalExampleMain; + +interface + +uses + Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, + JclExprEval; + +type + TForm1 = class(TForm) + ExpressionInput: TEdit; + Memo1: TMemo; + Label1: TLabel; + EnterButton: TButton; + FuncList: TComboBox; + Label2: TLabel; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure EnterButtonClick(Sender: TObject); + procedure FuncListClick(Sender: TObject); + private + { Private declarations } + FEvaluator: TEasyEvaluator; + FX: Extended; + FY: Extended; + FZ: Extended; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +uses + ExprEvalExampleLogic; + +procedure TForm1.FormCreate(Sender: TObject); +begin + FEvaluator := TEvaluator.Create; + FEvaluator.AddVar('X', FX); + FEvaluator.AddVar('Y', FY); + FEvaluator.AddVar('Z', FZ); + Init(FEvaluator, FuncList.Items); +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + FEvaluator.Free; +end; + +procedure TForm1.EnterButtonClick(Sender: TObject); +begin + Memo1.Lines.Add(ResultAsText(FEvaluator as TEvaluator, ExpressionInput.Text)); +end; + +procedure TForm1.FuncListClick(Sender: TObject); +begin + ExpressionInput.Text := ExpressionInput.Text + FuncList.Text; + ActiveControl := ExpressionInput; + ExpressionInput.SelStart := Length(ExpressionInput.Text); +end; + +end. diff --git a/official/1.100/examples/common/expreval/QExprEvalExample.dof b/official/1.100/examples/common/expreval/QExprEvalExample.dof new file mode 100644 index 0000000..abe45c2 --- /dev/null +++ b/official/1.100/examples/common/expreval/QExprEvalExample.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=..\..\..\bin diff --git a/official/1.100/examples/common/expreval/QExprEvalExample.dpr b/official/1.100/examples/common/expreval/QExprEvalExample.dpr new file mode 100644 index 0000000..fdb0edf --- /dev/null +++ b/official/1.100/examples/common/expreval/QExprEvalExample.dpr @@ -0,0 +1,16 @@ +program QExprEvalExample; + +uses + QForms, + JclExprEval in '..\..\..\source\common\JclExprEval.pas', + JclStrHashMap in '..\..\..\source\common\JclStrHashMap.pas', + ExprEvalExampleLogic in 'ExprEvalExampleLogic.pas', + QExprEvalExampleMain in 'QExprEvalExampleMain.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/common/expreval/QExprEvalExample.res b/official/1.100/examples/common/expreval/QExprEvalExample.res new file mode 100644 index 0000000000000000000000000000000000000000..ff24fa70c6a61f1121dd5a43dd91ace8c388f935 GIT binary patch literal 876 zcmd^8F%H5o47>nR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/expreval/QExprEvalExampleMain.pas b/official/1.100/examples/common/expreval/QExprEvalExampleMain.pas new file mode 100644 index 0000000..7faab6e --- /dev/null +++ b/official/1.100/examples/common/expreval/QExprEvalExampleMain.pas @@ -0,0 +1,62 @@ +unit QExprEvalExampleMain; + +interface + +uses + Types, SysUtils, Classes, + QGraphics, QControls, QForms, QStdCtrls, + JclExprEval; + +type + TForm1 = class(TForm) + ExpressionInput: TEdit; + Memo1: TMemo; + Label1: TLabel; + EnterButton: TButton; + FuncList: TComboBox; + Label2: TLabel; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure EnterButtonClick(Sender: TObject); + procedure FuncListClick(Sender: TObject); + private + { Private declarations } + FEvaluator: TEvaluator; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.XFM} + +uses + ExprEvalExampleLogic; + +procedure TForm1.FormCreate(Sender: TObject); +begin + FEvaluator := TEvaluator.Create; + Init(FEvaluator, FuncList.Items); +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + FEvaluator.Free; +end; + +procedure TForm1.EnterButtonClick(Sender: TObject); +begin + Memo1.Lines.Add(ResultAsText(FEvaluator, ExpressionInput.Text)); +end; + +procedure TForm1.FuncListClick(Sender: TObject); +begin + ExpressionInput.Text := ExpressionInput.Text + FuncList.Text; + ActiveControl := ExpressionInput; + ExpressionInput.SelStart := Length(ExpressionInput.Text); +end; + +end. diff --git a/official/1.100/examples/common/expreval/QExprEvalExampleMain.xfm b/official/1.100/examples/common/expreval/QExprEvalExampleMain.xfm new file mode 100644 index 0000000..a4eb14d --- /dev/null +++ b/official/1.100/examples/common/expreval/QExprEvalExampleMain.xfm @@ -0,0 +1,71 @@ +object Form1: TForm1 + Left = 222 + Top = 107 + Width = 487 + Height = 357 + Caption = 'JclExprEval Example' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 12 + Top = 12 + Width = 54 + Height = 13 + Caption = 'E&xpression:' + FocusControl = ExpressionInput + end + object Label2: TLabel + Left = 12 + Top = 40 + Width = 44 + Height = 13 + Caption = 'Functions:' + end + object ExpressionInput: TEdit + Left = 80 + Top = 8 + Width = 305 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end + object Memo1: TMemo + Left = 0 + Top = 60 + Width = 479 + Height = 270 + Anchors = [akLeft, akTop, akRight, akBottom] + TabOrder = 1 + end + object EnterButton: TButton + Left = 396 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Evaluate' + Default = True + TabOrder = 2 + OnClick = EnterButtonClick + end + object FuncList: TComboBox + Left = 80 + Top = 36 + Width = 145 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + Sorted = True + TabOrder = 3 + OnClick = FuncListClick + end +end diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemo.dof b/official/1.100/examples/common/filesearch/QFileSearchDemo.dof new file mode 100644 index 0000000..d447a0b --- /dev/null +++ b/official/1.100/examples/common/filesearch/QFileSearchDemo.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=../../../bin diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemo.dpr b/official/1.100/examples/common/filesearch/QFileSearchDemo.dpr new file mode 100644 index 0000000..2f04dc7 --- /dev/null +++ b/official/1.100/examples/common/filesearch/QFileSearchDemo.dpr @@ -0,0 +1,16 @@ +program QFileSearchDemo; + +{$I jcl.inc} + +uses + QForms, + QFileSearchDemoMain in 'QFileSearchDemoMain.pas' {FileSearchForm}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TFileSearchForm, FileSearchForm); + Application.Run; +end. diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemo.res b/official/1.100/examples/common/filesearch/QFileSearchDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..ff24fa70c6a61f1121dd5a43dd91ace8c388f935 GIT binary patch literal 876 zcmd^8F%H5o47>nR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemoMain.dfm b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.dfm new file mode 100644 index 0000000..d966eff --- /dev/null +++ b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.dfm @@ -0,0 +1,352 @@ +object FileSearchForm: TFileSearchForm + Left = 258 + Top = 301 + ClientWidth = 779 + ClientHeight = 482 + HorzScrollBar.Range = 378 + VertScrollBar.Range = 252 + ActiveControl = StartBtn + AutoScroll = False + Caption = 'File Search Demo (TJclFileEnumerator)' + Color = clBtnFace + Constraints.MinHeight = 279 + Constraints.MinWidth = 647 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = 12 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + OldCreateOrder = True + Position = poDefaultPosOnly + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object StatusBar: TStatusBar + Left = 0 + Top = 460 + Width = 779 + Height = 21 + Panels = < + item + Alignment = taRightJustify + Width = 100 + end + item + Alignment = taRightJustify + Width = 100 + end + item + Width = 50 + end> + end + object FileList: TListView + Left = 0 + Top = 181 + Width = 779 + Height = 279 + Align = alClient + Columns = < + item + Caption = 'File' + Width = 360 + end + item + Alignment = taRightJustify + AutoSize = True + Caption = 'Size' + end + item + Alignment = taCenter + AutoSize = True + Caption = 'Time' + end + item + Caption = 'Attr.' + Width = 60 + end> + ReadOnly = True + TabOrder = 1 + ViewStyle = vsReport + OnColumnClick = FileListColumnClick + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 779 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 14 + Top = 14 + Width = 16 + Height = 13 + Caption = 'List' + end + object Label2: TLabel + Left = 216 + Top = 14 + Width = 29 + Height = 13 + Caption = 'files in' + end + object RootDirInput: TEdit + Left = 256 + Top = 10 + Width = 248 + Height = 21 + TabOrder = 1 + end + object StartBtn: TButton + Left = 524 + Top = 10 + Width = 61 + Height = 25 + Caption = 'Start' + TabOrder = 2 + OnClick = StartBtnClick + end + object StopBtn: TButton + Left = 596 + Top = 10 + Width = 61 + Height = 25 + Caption = 'Stop' + Enabled = False + TabOrder = 3 + OnClick = StopBtnClick + end + object DetailsBtn: TButton + Left = 668 + Top = 10 + Width = 77 + Height = 25 + Caption = 'More >>' + TabOrder = 4 + OnClick = DetailsBtnClick + end + object FileMaskInput: TEdit + Left = 40 + Top = 10 + Width = 169 + Height = 21 + TabOrder = 0 + Text = '*' + end + end + object DetailsPanel: TPanel + Left = 0 + Top = 49 + Width = 779 + Height = 132 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + Visible = False + object GroupBox1: TGroupBox + Left = 256 + Top = 0 + Width = 249 + Height = 121 + Caption = 'File attributes' + TabOrder = 0 + object cbReadOnly: TCheckBox + Tag = 1 + Left = 16 + Top = 16 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Read only' + State = cbGrayed + TabOrder = 0 + OnClick = cbFileAttributeClick + end + object cbHidden: TCheckBox + Tag = 2 + Left = 16 + Top = 40 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Hidden' + TabOrder = 1 + OnClick = cbFileAttributeClick + end + object cbSystem: TCheckBox + Tag = 4 + Left = 16 + Top = 64 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'System' + TabOrder = 2 + OnClick = cbFileAttributeClick + end + object cbDirectory: TCheckBox + Tag = 16 + Left = 16 + Top = 88 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Directory' + TabOrder = 3 + OnClick = cbFileAttributeClick + end + object cbSymLink: TCheckBox + Tag = 64 + Left = 136 + Top = 16 + Width = 101 + Height = 21 + AllowGrayed = True + Caption = 'Symbolic link' + State = cbGrayed + TabOrder = 4 + OnClick = cbFileAttributeClick + end + object cbNormal: TCheckBox + Tag = 128 + Left = 136 + Top = 88 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Normal' + State = cbGrayed + TabOrder = 7 + OnClick = cbFileAttributeClick + end + object cbArchive: TCheckBox + Tag = 32 + Left = 136 + Top = 16 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Archive' + State = cbGrayed + TabOrder = 5 + OnClick = cbFileAttributeClick + end + object cbVolumeID: TCheckBox + Tag = 8 + Left = 136 + Top = 40 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Volume ID' + TabOrder = 6 + OnClick = cbFileAttributeClick + end + end + object cbLastChangeAfter: TCheckBox + Left = 524 + Top = 12 + Width = 131 + Height = 30 + Caption = 'Last change after' + TabOrder = 1 + end + object edLastChangeAfter: TEdit + Left = 656 + Top = 16 + Width = 113 + Height = 21 + MaxLength = 10 + TabOrder = 2 + end + object cbLastChangeBefore: TCheckBox + Left = 524 + Top = 36 + Width = 131 + Height = 30 + Caption = 'Last change before' + TabOrder = 3 + end + object edLastChangeBefore: TEdit + Left = 656 + Top = 40 + Width = 113 + Height = 21 + MaxLength = 10 + TabOrder = 4 + end + object cbFileSizeMax: TCheckBox + Left = 524 + Top = 60 + Width = 131 + Height = 30 + Caption = 'Maximum size' + TabOrder = 5 + end + object edFileSizeMax: TEdit + Left = 656 + Top = 64 + Width = 113 + Height = 21 + TabOrder = 6 + Text = '$7FFFFFFFFFFFFFFF' + end + object cbFileSizeMin: TCheckBox + Left = 524 + Top = 84 + Width = 131 + Height = 30 + Caption = 'Minimum size' + TabOrder = 7 + end + object edFileSizeMin: TEdit + Left = 656 + Top = 88 + Width = 113 + Height = 21 + TabOrder = 8 + Text = '0' + end + object IncludeSubDirectories: TCheckBox + Left = 40 + Top = 18 + Width = 157 + Height = 17 + Caption = 'Include sub directories' + Checked = True + State = cbChecked + TabOrder = 9 + OnClick = UpdateIncludeHiddenSubDirs + end + object IncludeHiddenSubDirs: TCheckBox + Left = 40 + Top = 42 + Width = 201 + Height = 17 + Caption = 'Include hidden sub directories' + TabOrder = 10 + OnClick = IncludeHiddenSubDirsClick + end + object cbDisplayLiveUpdate: TCheckBox + Left = 40 + Top = 90 + Width = 189 + Height = 17 + Caption = '&Display live update' + Checked = True + State = cbChecked + TabOrder = 12 + end + object cbCaseInsensitiveSearch: TCheckBox + Left = 40 + Top = 66 + Width = 177 + Height = 17 + Caption = 'Case insensitive search' + TabOrder = 11 + end + end +end diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemoMain.pas b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.pas new file mode 100644 index 0000000..204ce43 --- /dev/null +++ b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.pas @@ -0,0 +1,280 @@ +// +// Robert Rossmair, 2003 +// +unit QFileSearchDemoMain; + +{$INCLUDE jcl.inc} + +interface + +uses + SysUtils, Classes, + Types, Qt, QGraphics, QStdCtrls, QControls, QExtCtrls, QComCtrls, QForms, QMask, + JclStrings, JclFileUtils, QDialogs; + +type + TFileSearchForm = class(TForm) + StatusBar: TStatusBar; + FileList: TListView; + Panel1: TPanel; + Label1: TLabel; + RootDirInput: TEdit; + StartBtn: TButton; + StopBtn: TButton; + Label2: TLabel; + DetailsPanel: TPanel; + GroupBox1: TGroupBox; + cbReadOnly: TCheckBox; + cbHidden: TCheckBox; + cbSystem: TCheckBox; + cbDirectory: TCheckBox; + cbSymLink: TCheckBox; + cbNormal: TCheckBox; + cbArchive: TCheckBox; + DetailsBtn: TButton; + FileMaskInput: TEdit; + cbLastChangeAfter: TCheckBox; + edLastChangeAfter: TEdit; + cbLastChangeBefore: TCheckBox; + edLastChangeBefore: TEdit; + cbFileSizeMax: TCheckBox; + edFileSizeMax: TEdit; + cbFileSizeMin: TCheckBox; + edFileSizeMin: TEdit; + IncludeSubDirectories: TCheckBox; + IncludeHiddenSubDirs: TCheckBox; + cbDisplayLiveUpdate: TCheckBox; + cbCaseInsensitiveSearch: TCheckBox; + SaveBtn: TButton; + SaveDialog: TSaveDialog; + procedure StartBtnClick(Sender: TObject); + procedure StopBtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FileListColumnClick(Sender: TObject; Column: TListColumn); + procedure cbFileAttributeClick(Sender: TObject); + procedure UpdateIncludeHiddenSubDirs(Sender: TObject); + procedure IncludeHiddenSubDirsClick(Sender: TObject); + procedure DetailsBtnClick(Sender: TObject); + procedure SaveBtnClick(Sender: TObject); + private + { Private declarations } + FFileEnumerator: TJclFileEnumerator; + FDirCount: Integer; + FColumnIndex: Integer; + FTaskID: TFileSearchTaskID; + FT0: TDateTime; + FSortDirection: TSortDirection; + FFileListLiveUpdate: Boolean; + procedure DirectoryEntered(const Directory: string); + procedure AddFile(const Directory: string; const FileInfo: TSearchRec); + procedure TaskDone(const ID: TFileSearchTaskID; const Aborted: Boolean); + end; + +var + FileSearchForm: TFileSearchForm; + +implementation + +{$R *.xfm} + +procedure TFileSearchForm.FormCreate(Sender: TObject); +begin + FFileEnumerator := TJclFileEnumerator.Create; + FFileEnumerator.OnEnterDirectory := DirectoryEntered; + FFileEnumerator.OnTerminateTask := TaskDone; + FileMaskInput.Text := '*.pas;*.dfm;*.xfm;*.dpr;*.dpk*'; + RootDirInput.Text := ExpandFileName(FFileEnumerator.RootDirectory); + edLastChangeAfter.Text := FFileEnumerator.LastChangeAfterAsString; + edLastChangeBefore.Text := FFileEnumerator.LastChangeBeforeAsString; + cbCaseInsensitiveSearch.Checked := not FFileEnumerator.CaseSensitiveSearch; + {$IFDEF MSWINDOWS} + cbSymLink.Visible := False; + {$ENDIF MSWINDOWS} + {$IFDEF UNIX} + FileList.Columns.Add.Caption := 'Link'; + cbArchive.Visible := False; + {$ENDIF UNIX} +end; + +procedure TFileSearchForm.FormDestroy(Sender: TObject); +begin + FFileEnumerator.Free; + { + FileList.Items.BeginUpdate; + FileList.Items.Clear; + FileList.Items.EndUpdate; + } +end; + +procedure TFileSearchForm.DirectoryEntered(const Directory: string); +begin + Inc(FDirCount); + StatusBar.Panels[0].Text := Format('%d files', [FileList.Items.Count]); + StatusBar.Panels[1].Text := Format('%d directories', [FDirCount]); + StatusBar.Panels[2].Text := Format('Processing %s...', [Directory]); +end; + +procedure TFileSearchForm.AddFile(const Directory: string; const FileInfo: TSearchRec); +var + ListItem: TListItem; + S: string; +begin + ListItem := FileList.Items.Add; + with ListItem do + begin + Caption := Directory + FileInfo.Name; + Str(GetSizeOfFile(FileInfo):13, S); + SubItems.Add(S); + SubItems.Add(FormatDateTime(' yyyy-mm-dd hh:nn:ss ', FileDateToDateTime(FileInfo.Time))); + SubItems.Add(FileAttributesStr(FileInfo)); + {$IFDEF UNIX} + if (FileInfo.Attr and faSymLink) <> 0 then + SubItems.Add(SymbolicLinkTarget(Caption)); + {$ENDIF UNIX} + SubItems.Add(FileGetOwnerName(Caption)); + SubItems.Add(FileGetGroupName(Caption)); + end; +end; + +procedure TFileSearchForm.TaskDone(const ID: TFileSearchTaskID; const Aborted: Boolean); +begin + if not FFileListLiveUpdate then + FileList.Items.EndUpdate; + StatusBar.Panels[0].Text := Format('%d files', [FileList.Items.Count]); + if Aborted then + StatusBar.Panels[2].Text := 'Prematurely aborted.' + else + StatusBar.Panels[2].Text := Format('...finished (%f seconds).', [(Now - FT0) * SecsPerDay]); + FileList.Sorted := True; + StartBtn.Enabled := True; + SaveBtn.Enabled := True; + StopBtn.Enabled := False; + ActiveControl := StartBtn; +end; + +procedure TFileSearchForm.StartBtnClick(Sender: TObject); +begin + RootDirInput.Text := PathCanonicalize(RootDirInput.Text); + + FFileEnumerator.SearchOption[fsLastChangeAfter] := cbLastChangeAfter.Checked; + FFileEnumerator.SearchOption[fsLastChangeBefore] := cbLastChangeBefore.Checked; + if FFileEnumerator.SearchOption[fsLastChangeAfter] then + FFileEnumerator.LastChangeAfterAsString := edLastChangeAfter.Text; + if FFileEnumerator.SearchOption[fsLastChangeBefore] then + FFileEnumerator.LastChangeBeforeAsString := edLastChangeBefore.Text; + FFileEnumerator.RootDirectory := RootDirInput.Text; + FFileEnumerator.FileMask := FileMaskInput.Text; + FFileEnumerator.SearchOption[fsMinSize] := cbFileSizeMin.Checked; + FFileEnumerator.SearchOption[fsMaxSize] := cbFileSizeMax.Checked; + FFileEnumerator.FileSizeMin := StrToInt64(edFileSizeMin.Text); + FFileEnumerator.FileSizeMax := StrToInt64(edFileSizeMax.Text); + FFileEnumerator.IncludeSubDirectories := IncludeSubDirectories.Checked; + FFileEnumerator.IncludeHiddenSubDirectories := IncludeHiddenSubDirs.Checked; + FFileEnumerator.CaseSensitiveSearch := not cbCaseInsensitiveSearch.Checked; + FDirCount := 0; + + StartBtn.Enabled := False; + StopBtn.Enabled := True; + SaveBtn.Enabled := False; + ActiveControl := StopBtn; + + FFileListLiveUpdate := cbDisplayLiveUpdate.Checked; + + FileList.Items.Clear; + if not FFileListLiveUpdate then + FileList.Items.BeginUpdate; + FileList.Sorted := False; + + FT0 := Now; + FTaskID := FFileEnumerator.ForEach(AddFile); +end; + +procedure TFileSearchForm.StopBtnClick(Sender: TObject); +begin + FFileEnumerator.StopTask(FTaskID); +end; + +procedure TFileSearchForm.FileListColumnClick(Sender: TObject; Column: TListColumn); +const + SD: array[TSortDirection] of TSortDirection = (sdDescending, sdAscending); +begin + if FColumnIndex = Column.Index then + begin + FSortDirection := SD[FSortDirection]; + FileList.SortDirection := FSortDirection; + end + else + FColumnIndex := Column.Index; +end; + +procedure TFileSearchForm.cbFileAttributeClick(Sender: TObject); +const + Interest: array[TCheckBoxState] of TAttributeInterest = (aiRejected, aiRequired, aiIgnored); + CBState: array[TAttributeInterest] of TCheckBoxState = (cbGrayed, cbUnchecked, cbChecked); +begin + with FFileEnumerator.AttributeMask do + begin + with Sender as TCheckBox do + Attribute[Tag] := Interest[State]; + cbReadOnly.State := CBState[ReadOnly]; + cbHidden.State := CBState[Hidden]; + cbSystem.State := CBState[System]; + cbDirectory.State := CBState[Directory]; + cbNormal.State := CBState[Normal]; +{$IFDEF UNIX} + cbSymLink.State := CBState[SymLink]; +{$ENDIF def UNIX} +{$IFDEF MSWINDOWS} + cbArchive.State := CBState[Archive]; +{$ENDIF def MSWINDOWS} + end; +end; + +procedure TFileSearchForm.UpdateIncludeHiddenSubDirs(Sender: TObject); +begin + IncludeHiddenSubDirs.AllowGrayed := not IncludeSubDirectories.Checked; + if IncludeSubDirectories.Checked then + begin + if IncludeHiddenSubDirs.State = cbGrayed then + IncludeHiddenSubDirs.State := cbChecked; + end + else + begin + if IncludeHiddenSubDirs.State = cbChecked then + IncludeHiddenSubDirs.State := cbGrayed; + end; +end; + +procedure TFileSearchForm.IncludeHiddenSubDirsClick(Sender: TObject); +begin + if not IncludeSubDirectories.Checked then + if IncludeHiddenSubDirs.State = cbChecked then + IncludeHiddenSubDirs.State := cbUnchecked; +end; + +procedure TFileSearchForm.DetailsBtnClick(Sender: TObject); +const + DetailsBtnCaptions: array[Boolean] of string = ('More >>', 'Less <<'); +begin + DetailsPanel.Visible := not DetailsPanel.Visible; + DetailsBtn.Caption := DetailsBtnCaptions[DetailsPanel.Visible]; +end; + +procedure TFileSearchForm.SaveBtnClick(Sender: TObject); +var + I: Integer; +begin + if SaveDialog.Execute then + with TStringList.Create do + try + for I := 0 to FileList.Items.Count - 1 do + Add(FileList.Items[I].Caption); + SaveToFile(SaveDialog.FileName); + finally + Free; + end; +end; + +end. + diff --git a/official/1.100/examples/common/filesearch/QFileSearchDemoMain.xfm b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.xfm new file mode 100644 index 0000000..a8a3330 --- /dev/null +++ b/official/1.100/examples/common/filesearch/QFileSearchDemoMain.xfm @@ -0,0 +1,378 @@ +object FileSearchForm: TFileSearchForm + Left = 267 + Top = 302 + Width = 787 + Height = 509 + VertScrollBar.Range = 252 + HorzScrollBar.Range = 378 + ActiveControl = StartBtn + AutoScroll = False + Caption = 'File Search Demo (TJclFileEnumerator)' + Color = clButton + Constraints.MinHeight = 279 + Constraints.MinWidth = 647 + Font.Color = clBlack + Font.Height = 12 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Position = poDefaultPosOnly + Scaled = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + object StatusBar: TStatusBar + Left = 0 + Top = 488 + Width = 787 + Height = 21 + Panels = < + item + Alignment = taRightJustify + Width = 100 + end + item + Alignment = taRightJustify + Width = 100 + end + item + end> + end + object FileList: TListView + Left = 0 + Top = 181 + Width = 787 + Height = 307 + Align = alClient + Columns = < + item + Caption = 'File' + Tag = 0 + Width = 360 + end + item + Alignment = taRightJustify + AutoSize = True + Caption = 'Size' + Tag = 0 + Width = 50 + end + item + Alignment = taCenter + AutoSize = True + Caption = 'Time' + Tag = 0 + Width = 50 + end + item + Caption = 'Attr.' + Tag = 0 + Width = 60 + end + item + Caption = 'Owner' + Tag = 0 + Width = 100 + end + item + Caption = 'Group' + Tag = 0 + Width = 50 + end> + ReadOnly = True + ShowColumnSortIndicators = True + Sorted = True + TabOrder = 1 + ViewStyle = vsReport + OnColumnClick = FileListColumnClick + end + object Panel1: TPanel + Left = 0 + Top = 0 + Width = 787 + Height = 49 + Align = alTop + BevelOuter = bvNone + TabOrder = 2 + object Label1: TLabel + Left = 14 + Top = 14 + Width = 16 + Height = 13 + Caption = 'List' + end + object Label2: TLabel + Left = 216 + Top = 14 + Width = 29 + Height = 13 + Caption = 'files in' + end + object RootDirInput: TEdit + Left = 256 + Top = 10 + Width = 248 + Height = 21 + TabOrder = 1 + end + object StartBtn: TButton + Left = 524 + Top = 10 + Width = 47 + Height = 25 + Caption = 'Start' + TabOrder = 2 + OnClick = StartBtnClick + end + object StopBtn: TButton + Left = 576 + Top = 10 + Width = 47 + Height = 25 + Caption = 'Stop' + Enabled = False + TabOrder = 3 + OnClick = StopBtnClick + end + object DetailsBtn: TButton + Left = 692 + Top = 10 + Width = 77 + Height = 25 + Caption = 'More >>' + TabOrder = 5 + OnClick = DetailsBtnClick + end + object FileMaskInput: TEdit + Left = 40 + Top = 10 + Width = 169 + Height = 21 + TabOrder = 0 + Text = '*' + end + object SaveBtn: TButton + Left = 628 + Top = 10 + Width = 47 + Height = 25 + Caption = 'Save...' + Enabled = False + TabOrder = 4 + OnClick = SaveBtnClick + end + end + object DetailsPanel: TPanel + Left = 0 + Top = 49 + Width = 787 + Height = 132 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + Visible = False + object GroupBox1: TGroupBox + Left = 256 + Top = 0 + Width = 249 + Height = 121 + Caption = 'File attributes' + TabOrder = 0 + object cbReadOnly: TCheckBox + Tag = 1 + Left = 16 + Top = 16 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Read only' + Checked = True + State = cbGrayed + TabOrder = 0 + OnClick = cbFileAttributeClick + end + object cbHidden: TCheckBox + Tag = 2 + Left = 16 + Top = 40 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Hidden' + TabOrder = 1 + OnClick = cbFileAttributeClick + end + object cbSystem: TCheckBox + Tag = 4 + Left = 16 + Top = 64 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'System' + TabOrder = 2 + OnClick = cbFileAttributeClick + end + object cbDirectory: TCheckBox + Tag = 16 + Left = 16 + Top = 88 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Directory' + TabOrder = 3 + OnClick = cbFileAttributeClick + end + object cbSymLink: TCheckBox + Tag = 64 + Left = 136 + Top = 16 + Width = 101 + Height = 21 + AllowGrayed = True + Caption = 'Symbolic link' + Checked = True + State = cbGrayed + TabOrder = 4 + OnClick = cbFileAttributeClick + end + object cbNormal: TCheckBox + Tag = 128 + Left = 136 + Top = 88 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Normal' + Checked = True + State = cbGrayed + TabOrder = 6 + OnClick = cbFileAttributeClick + end + object cbArchive: TCheckBox + Tag = 32 + Left = 136 + Top = 16 + Width = 89 + Height = 21 + AllowGrayed = True + Caption = 'Archive' + Checked = True + State = cbGrayed + TabOrder = 5 + OnClick = cbFileAttributeClick + end + end + object cbLastChangeAfter: TCheckBox + Left = 524 + Top = 12 + Width = 131 + Height = 30 + Caption = 'Last change after' + TabOrder = 1 + end + object edLastChangeAfter: TEdit + Left = 656 + Top = 16 + Width = 113 + Height = 21 + MaxLength = 10 + TabOrder = 2 + end + object cbLastChangeBefore: TCheckBox + Left = 524 + Top = 36 + Width = 131 + Height = 30 + Caption = 'Last change before' + TabOrder = 3 + end + object edLastChangeBefore: TEdit + Left = 656 + Top = 40 + Width = 113 + Height = 21 + MaxLength = 10 + TabOrder = 4 + end + object cbFileSizeMax: TCheckBox + Left = 524 + Top = 60 + Width = 131 + Height = 30 + Caption = 'Maximum size' + TabOrder = 5 + end + object edFileSizeMax: TEdit + Left = 656 + Top = 64 + Width = 113 + Height = 21 + TabOrder = 6 + Text = '$7FFFFFFFFFFFFFFF' + end + object cbFileSizeMin: TCheckBox + Left = 524 + Top = 84 + Width = 131 + Height = 30 + Caption = 'Minimum size' + TabOrder = 7 + end + object edFileSizeMin: TEdit + Left = 656 + Top = 88 + Width = 113 + Height = 21 + TabOrder = 8 + Text = '0' + end + object IncludeSubDirectories: TCheckBox + Left = 40 + Top = 18 + Width = 157 + Height = 17 + Caption = 'Include sub directories' + Checked = True + State = cbChecked + TabOrder = 9 + OnClick = UpdateIncludeHiddenSubDirs + end + object IncludeHiddenSubDirs: TCheckBox + Left = 40 + Top = 42 + Width = 201 + Height = 17 + Caption = 'Include hidden sub directories' + TabOrder = 10 + OnClick = IncludeHiddenSubDirsClick + end + object cbDisplayLiveUpdate: TCheckBox + Left = 40 + Top = 90 + Width = 189 + Height = 17 + Caption = '&Display live update' + TabOrder = 12 + end + object cbCaseInsensitiveSearch: TCheckBox + Left = 40 + Top = 66 + Width = 177 + Height = 17 + Caption = 'Case insensitive search' + TabOrder = 11 + end + end + object SaveDialog: TSaveDialog + FilterIndex = 0 + Height = 0 + Title = 'Save' + Width = 0 + Left = 740 + Top = 36 + end +end diff --git a/official/1.100/examples/common/graphics/QClipLineDemo.dof b/official/1.100/examples/common/graphics/QClipLineDemo.dof new file mode 100644 index 0000000..3d5dc48 --- /dev/null +++ b/official/1.100/examples/common/graphics/QClipLineDemo.dof @@ -0,0 +1,4 @@ +[Directories] +OutputDir=../../../bin +Conditionals=VisualCLX;MATH_SINGLE_PRECISION + diff --git a/official/1.100/examples/common/graphics/QClipLineDemo.dpr b/official/1.100/examples/common/graphics/QClipLineDemo.dpr new file mode 100644 index 0000000..29e4839 --- /dev/null +++ b/official/1.100/examples/common/graphics/QClipLineDemo.dpr @@ -0,0 +1,17 @@ +program QClipLineDemo; + +{$I jcl.inc} + +uses + QStyle, + QForms, + QClipLineDemoMain in 'QClipLineDemoMain.pas' {Form1}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/common/graphics/QClipLineDemo.res b/official/1.100/examples/common/graphics/QClipLineDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..093026528930ea46204ac34ba193dc8155a7cef9 GIT binary patch literal 876 zcmd^8F%H5o47>tT7X%&H$;ikL05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpUIhDH*sO#C6pBW7ZVvRaH6Zi&oq?VoMY-*|X+uqINP;fNg$I1ziCnfrL13z>!j L&Q&@UGDQWRn6_4} literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/graphics/QClipLineDemoMain.dfm b/official/1.100/examples/common/graphics/QClipLineDemoMain.dfm new file mode 100644 index 0000000..3cada53 --- /dev/null +++ b/official/1.100/examples/common/graphics/QClipLineDemoMain.dfm @@ -0,0 +1,17 @@ +object Form1: TForm1 + Left = 198 + Top = 147 + Width = 400 + Height = 400 + Caption = 'ClipLine Demo' + Color = 15790320 + OnCreate = FormCreate + OnPaint = FormPaint + PixelsPerInch = 96 + TextHeight = 13 + object Timer1: TTimer + Enabled = False + Left = 32 + Top = 24 + end +end diff --git a/official/1.100/examples/common/graphics/QClipLineDemoMain.pas b/official/1.100/examples/common/graphics/QClipLineDemoMain.pas new file mode 100644 index 0000000..35de763 --- /dev/null +++ b/official/1.100/examples/common/graphics/QClipLineDemoMain.pas @@ -0,0 +1,94 @@ +unit QClipLineDemoMain; + +{$I jcl.inc} + +interface + +uses + SysUtils, Types, Classes, +{$IFDEF MSWINDOWS} + Windows, +{$ENDIF} +{$IFDEF VisualCLX} + Qt, QGraphics, QControls, QForms, QStdCtrls, QExtCtrls, QTypes, JclQGraphUtils, +{$ENDIF VisualCLX} +{$IFDEF VCL} + Graphics, ExtCtrls, Forms, JclGraphUtils, +{$ENDIF VCL} + JclBase; + +type + TForm1 = class(TForm) + Timer1: TTimer; + procedure FormCreate(Sender: TObject); + procedure FormPaint(Sender: TObject); + procedure Timer1Timer(Sender: TObject); + private + { Private declarations } + R: TRect; + P: TPointArray; + FPenColor: TColor; + FPenColorLight: TColor; + procedure InitLines; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$IFDEF VisualCLX} +{$R *.xfm} +{$ELSE} +{$R *.dfm} +{$ENDIF} + +procedure TForm1.FormCreate(Sender: TObject); +begin + Randomize; + R.Left := 100; + R.Top := 100; + R.Right := 300; + R.Bottom := 300; + SetLength(P, 50); + InitLines; +end; + +procedure TForm1.FormPaint(Sender: TObject); +begin + Canvas.Brush.Color := clWhite; + Canvas.FillRect(R); + Canvas.Pen.Color := FPenColorLight; + Canvas.PolyLine(P); + Canvas.Pen.Color := FPenColor; + DrawPolyLine(Canvas, P, R); +end; + +procedure TForm1.InitLines; +var + i: Integer; + H, S, L: Single; +begin + for i := 0 to Length(P)-1 do + begin + P[i].X := Random(Width); + P[i].Y := Random(Height); + end; + H := Random; + S := Random; + L := 0.4 * Random; + + FPenColor := WinColor(HSLToRGB(H, S, L)); + FPenColorLight := WinColor(HSLToRGB(H, S, 1 - 0.2 * (1 - L))); +end; + +procedure TForm1.Timer1Timer(Sender: TObject); +begin + InitLines; + Refresh; +end; + +end. + diff --git a/official/1.100/examples/common/graphics/QClipLineDemoMain.xfm b/official/1.100/examples/common/graphics/QClipLineDemoMain.xfm new file mode 100644 index 0000000..df54ff9 --- /dev/null +++ b/official/1.100/examples/common/graphics/QClipLineDemoMain.xfm @@ -0,0 +1,19 @@ +object Form1: TForm1 + Left = 198 + Top = 147 + Width = 400 + Height = 400 + Caption = 'ClipLine Demo' + Color = 15790320 + OnCreate = FormCreate + OnPaint = FormPaint + PixelsPerInch = 96 + TextHeight = 13 + TextWidth = 6 + object Timer1: TTimer + Interval = 3000 + OnTimer = Timer1Timer + Left = 32 + Top = 24 + end +end diff --git a/official/1.100/examples/common/graphics/StretchGraphicDemoMain.dfm b/official/1.100/examples/common/graphics/StretchGraphicDemoMain.dfm new file mode 100644 index 0000000..8a55a35 --- /dev/null +++ b/official/1.100/examples/common/graphics/StretchGraphicDemoMain.dfm @@ -0,0 +1,217 @@ +object StretchDemoForm: TStretchDemoForm + Left = 255 + Top = 208 + ClientWidth = 780 + ClientHeight = 583 + VertScrollBar.Range = 19 + ActiveControl = PageControl + AutoScroll = False + Caption = 'JCL Picture Viewer' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 12 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + KeyPreview = True + Menu = MainMenu + OldCreateOrder = True + ShowHint = True + OnCreate = FormCreate + OnKeyDown = FormKeyDown + PixelsPerInch = 96 + TextHeight = 13 + object PageControl: TPageControl + Left = 0 + Top = 0 + Width = 780 + Height = 544 + ActivePage = OriginalPage + Align = alClient + TabOrder = 0 + OnChanging = PageControlChanging + object OriginalPage: TTabSheet + Caption = 'Original' + object ScrollBox: TScrollBox + Left = 0 + Top = 0 + Width = 772 + Height = 516 + HorzScrollBar.Tracking = True + VertScrollBar.Tracking = True + Align = alClient + Color = clGray + ParentColor = False + TabOrder = 0 + object OriginalImage: TImage + Left = 0 + Top = 0 + Width = 768 + Height = 512 + AutoSize = True + end + end + end + object StretchedPage: TTabSheet + Caption = 'Resized' + ImageIndex = 1 + OnResize = StretchedPageResize + OnShow = StretchedPageShow + object Bevel1: TBevel + Left = 0 + Top = 0 + Width = 772 + Height = 516 + Align = alClient + end + object StretchedImage: TImage + Left = 1 + Top = 1 + Width = 770 + Height = 513 + Anchors = [akLeft, akTop, akRight, akBottom] + end + end + object FilesPage: TTabSheet + Caption = 'Files' + ImageIndex = 2 + object FileListView: TListView + Left = 0 + Top = 0 + Width = 772 + Height = 516 + Align = alClient + Columns = < + item + AutoSize = True + Caption = 'File' + MaxWidth = 800 + MinWidth = 300 + end + item + Caption = 'Size' + end> + HideSelection = False + TabOrder = 0 + ViewStyle = vsReport + OnClick = FileListViewClick + OnKeyDown = FileListViewKeyDown + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 544 + Width = 780 + Height = 19 + Panels = < + item + Width = 120 + end + item + Width = 120 + end + item + Width = 120 + end> + SimplePanel = False + end + object OpenDialog: TOpenDialog + Filter = + 'All (*.jpg;*.jpeg;*.bmp)|*.jpg;*.jpeg;*.bmp|JPEG Image File (*.j' + + 'pg)|*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp' + FilterIndex = 0 + Title = 'Open' + Left = 240 + Top = 68 + end + object MainMenu: TMainMenu + Left = 208 + Top = 68 + object Fil1: TMenuItem + Caption = '&File' + object Open1: TMenuItem + Caption = 'Open...' + OnClick = OpenFile + end + object N1: TMenuItem + Caption = '-' + end + object ExitItem: TMenuItem + Caption = 'E&xit' + OnClick = ExitApp + end + end + object Filter1: TMenuItem + Caption = '&Resampling Filter' + object Box1: TMenuItem + Caption = 'Bo&x' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Triangle1: TMenuItem + Tag = 1 + Caption = '&Triangle' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Hermite1: TMenuItem + Tag = 2 + Caption = '&Hermite' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Bell1: TMenuItem + Tag = 3 + Caption = '&Bell' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Spline1: TMenuItem + Tag = 4 + Caption = '&Spline' + Checked = True + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Lanczos31: TMenuItem + Tag = 5 + Caption = '&Lanczos 3' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + object Mitchell1: TMenuItem + Tag = 6 + Caption = '&Mitchell' + GroupIndex = 1 + RadioItem = True + OnClick = SelectFilter + end + end + object Options1: TMenuItem + Caption = '&Options' + object PreserveAspectRatio1: TMenuItem + Caption = 'Preserve Aspect Ratio' + Checked = True + OnClick = PreserveAspectRatio1Click + end + end + object PrevItem: TMenuItem + Caption = ' &<< ' + Hint = 'Previous file in directory' + OnClick = PrevFile + end + object NextItem: TMenuItem + Caption = ' &>> ' + Hint = 'Next file in directory' + OnClick = NextFile + end + end +end diff --git a/official/1.100/examples/common/graphics/StretchGraphicDemoMain.pas b/official/1.100/examples/common/graphics/StretchGraphicDemoMain.pas new file mode 100644 index 0000000..9dbbecf --- /dev/null +++ b/official/1.100/examples/common/graphics/StretchGraphicDemoMain.pas @@ -0,0 +1,510 @@ +// +// Robert Rossmair, 2002-09-22 +// revised 2005-06-26 +// + +{$I jcl.inc} + +{$IFDEF RTL140_UP} + {$IFDEF VCL} + {$DEFINE HasShellCtrls} // $(Delphi)\Demos\ShellControls\ShellCtrls.pas + {$ENDIF VCL} +{$ENDIF RTL140_UP} + +unit StretchGraphicDemoMain; + +interface + +uses + SysUtils, Classes, + {$IFDEF MSWINDOWS} + Windows, Messages, JPEG, ShellAPI, + {$ENDIF MSWINDOWS} + {$IFDEF VCL} + Graphics, Controls, Forms, + Dialogs, ComCtrls, StdCtrls, Menus, ExtCtrls, ExtDlgs, + JclGraphics, + {$ENDIF VCL} + {$IFDEF VisualCLX} + Qt, QGraphics, QMenus, QTypes, QExtCtrls, QComCtrls, QStdCtrls, + QControls, QForms, QDialogs, + JclQGraphics, + {$ENDIF VisualCLX} + {$IFDEF HasShellCtrls} + {$WARN UNIT_PLATFORM OFF} + ShellCtrls, + {$ENDIF HasShellCtrls} + JclFileUtils; + +type + TStretchDemoForm = class(TForm) + PageControl: TPageControl; + OriginalPage: TTabSheet; + StretchedPage: TTabSheet; + StretchedImage: TImage; + MainMenu: TMainMenu; + Fil1: TMenuItem; + Open1: TMenuItem; + N1: TMenuItem; + ExitItem: TMenuItem; + Filter1: TMenuItem; + Box1: TMenuItem; + Triangle1: TMenuItem; + Hermite1: TMenuItem; + Bell1: TMenuItem; + Spline1: TMenuItem; + Lanczos31: TMenuItem; + Mitchell1: TMenuItem; + Options1: TMenuItem; + PreserveAspectRatio1: TMenuItem; + PrevItem: TMenuItem; + NextItem: TMenuItem; + FilesPage: TTabSheet; + ScrollBox: TScrollBox; + StatusBar: TStatusBar; + Bevel1: TBevel; + OpenDialog: TOpenDialog; + FileListView: TListView; + OriginalImage: TImage; + procedure FormCreate(Sender: TObject); + {$IFDEF VCL} + procedure FormDestroy(Sender: TObject); + {$ENDIF VCL} + procedure OpenFile(Sender: TObject); + procedure SelectFilter(Sender: TObject); + procedure PreserveAspectRatio1Click(Sender: TObject); + procedure ExitApp(Sender: TObject); + procedure PrevFile(Sender: TObject); + procedure NextFile(Sender: TObject); + procedure FileListViewClick(Sender: TObject); + procedure LoadSelected; + procedure FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + procedure StretchedPageShow(Sender: TObject); + procedure StretchedPageResize(Sender: TObject); + procedure PageControlChanging(Sender: TObject; + var AllowChange: Boolean); + procedure FileListViewKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); + {$IFDEF HasShellCtrls} + procedure ShellChange; + private + FShellChangeNotifier: TShellChangeNotifier; + {$ELSE} + private + {$ENDIF HasShellCtrls} + FLastImagePage: TTabSheet; + FFileName: string; + FDir: string; + FWidth: Integer; + FHeight: Integer; + FStretchTime: LongWord; + FPreserveAspectRatio: Boolean; + FResamplingFilter: TResamplingFilter; + procedure AddToFileList(const Directory: string; const FileInfo: TSearchRec); + procedure FileSearchTerminated(const ID: TFileSearchTaskID; const Aborted: Boolean); + function ChangeDirectory: Boolean; + procedure DoStretch; + procedure LoadFile(const AFileName: string); + procedure InvalidateStretched; + procedure UpdateCaption; + procedure UpdateFileList; + procedure UpdateNavButtons; + procedure UpdateStretched; + function GetFileListIndex: Integer; + procedure SetFileListIndex(const Value: Integer); + procedure SetFileName(const Value: string); + {$IFDEF VCL} + procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DropFiles; + {$ENDIF VCL} + protected + property FileListIndex: Integer read GetFileListIndex write SetFileListIndex; + property FileName: string read FFileName write SetFileName; + end; + +var + StretchDemoForm: TStretchDemoForm; + +implementation + +{$IFDEF VCL} +{$R *.dfm} +{$ENDIF} +{$IFDEF VisualCLX} +{$R *.xfm} +{$ENDIF VisualCLX} + +var + FileMask: string; + +{$IFDEF MSWINDOWS} +type + TWMDropFilesCallback = procedure (const FileName: string) of object; + +procedure ProcessWMDropFiles(var Msg: TWMDropFiles; Callback: TWMDropFilesCallback; DropPoint: PPoint = nil); overload; +var + i: Integer; + FileName: array[0..MAX_PATH] of Char; +begin + try + // in case DropPoint is evaluated by callback method, get it first + if DropPoint <> nil then + DragQueryPoint(Msg.Drop, DropPoint^); + if Assigned(Callback) then + for i := 0 to DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) - 1 do + begin + DragQueryFile(Msg.Drop, i, FileName, MAX_PATH); + Callback(FileName); + end; + Msg.Result := 0; + finally + DragFinish(Msg.Drop); + end; +end; + +procedure ProcessWMDropFiles(var Msg: TWMDropFiles; FileNames: TStrings; DropPoint: PPoint = nil); overload; +begin + ProcessWMDropFiles(Msg, FileNames.Append, DropPoint); +end; +{$ENDIF MSWINDOWS} + +function IsGraphicFile(const FileName: string): Boolean; overload; +var + Ext: string; +begin + Ext := AnsiLowerCase(ExtractFileExt(FileName)); + Result := (Pos(Ext, FileMask) > 0); +end; + +function IsGraphicFile(const Attr: Integer; const FileInfo: TSearchRec): Boolean; overload; +begin + Result := IsGraphicFile(FileInfo.Name); +end; + +procedure TStretchDemoForm.FormCreate(Sender: TObject); +begin + StretchedPage.Brush.Color := clGray; + {$IFDEF VCL} + ScrollBox.DoubleBuffered := True; + StretchedPage.DoubleBuffered := True; + {$ENDIF VCL} + FileMask := GraphicFileMask(TGraphic); + //Format('%s;%s', [GraphicFileMask(TJPEGImage), GraphicFileMask(TBitmap)]); + OpenDialog.Filter := GraphicFilter(TGraphic); + FResamplingFilter := rfSpline; // rfLanczos3; + FPreserveAspectRatio := True; + UpdateNavButtons; + {$IFDEF HasShellCtrls} + FShellChangeNotifier := TShellChangeNotifier.Create(Self); + with FShellChangeNotifier do + begin + WatchSubTree := False; + OnChange := ShellChange; + NotifyFilters := [ + nfFileNameChange, + nfDirNameChange, + //nfSizeChange, + nfWriteChange, + nfSecurityChange]; + end; + {$ENDIF HasShellCtrls} + {$IFDEF VCL} + DragAcceptFiles(Handle, True); + {$ENDIF VCL} + if ParamCount > 0 then + with OpenDialog do + begin + FileName := ParamStr(1); + InitialDir := ExtractFileDir(FileName); + LoadFile(FileName); + end; +end; + +{$IFDEF VCL} +procedure TStretchDemoForm.FormDestroy(Sender: TObject); +begin + DragAcceptFiles(Handle, False); +end; +{$ENDIF VCL} + +procedure TStretchDemoForm.ExitApp(Sender: TObject); +begin + Close; +end; + +function TStretchDemoForm.ChangeDirectory: Boolean; +var + Dir, D: string; +begin + D := ExtractFileDir(FileName); + Dir := PathAddSeparator(D); + Result := (Dir <> FDir) and (Pos(FDir, Dir) <> 1); + if Result then + begin + FDir := Dir; + FilesPage.Caption := Format('Files in %s', [D]); + OpenDialog.InitialDir := D; + {$IFDEF HasShellCtrls} + FShellChangeNotifier.Root := D; + {$ELSE} + UpdateFileList; + {$ENDIF HasShellCtrls} + end; +end; + +procedure TStretchDemoForm.AddToFileList(const Directory: string; const FileInfo: TSearchRec); +begin + with FileListView.Items.Add do + begin + Caption := Directory + FileInfo.Name; + end; +end; + +procedure TStretchDemoForm.FileSearchTerminated(const ID: TFileSearchTaskID; const Aborted: Boolean); +begin + with FileListView do + Selected := FindCaption(0, FileName, False, True, False); + StatusBar.Panels[0].Text := Format('%d files', [FileListView.Items.Count]); + UpdateNavButtons; +end; + +procedure TStretchDemoForm.UpdateFileList; +begin + FileListView.Items.Clear; + with FileSearch do + begin + FileMask := GraphicFileMask(TGraphic); + RootDirectory := FDir; + OnTerminateTask := FileSearchTerminated; + ForEach(AddToFileList); + end; +end; + +procedure TStretchDemoForm.LoadFile(const AFileName: string); +begin + if not IsGraphicFile(AFileName) then + Exit; + FileName := AFileName; + OriginalImage.Picture.LoadFromFile(FileName); + if not ChangeDirectory then + UpdateNavButtons; + + UpdateCaption; + with FileListView do + Selected := FindCaption(0, FileName, False, True, False); + + StretchedImage.Picture.Graphic := nil; + InvalidateStretched; + if PageControl.ActivePage = FilesPage then + begin + {$IFDEF VCL} + if OriginalImage.Picture.Graphic is TMetaFile then + PageControl.ActivePage := OriginalPage + else + {$ENDIF VCL} + PageControl.ActivePage := FLastImagePage; + FocusControl(PageControl); + end; +end; + +procedure TStretchDemoForm.OpenFile(Sender: TObject); +begin + if OpenDialog.Execute then + LoadFile(OpenDialog.FileName); +end; + +procedure TStretchDemoForm.SelectFilter(Sender: TObject); +begin + with Sender as TMenuItem do + begin + Checked := True; + FResamplingFilter := TResamplingFilter(Tag); + InvalidateStretched; + end; +end; + +procedure TStretchDemoForm.DoStretch; +var + W, H: Integer; + T: LongWord; +begin + with OriginalImage.Picture do + if (Graphic = nil) {$IFDEF VCL} or (Graphic is TMetafile) {$ENDIF} then + Exit; + W := StretchedPage.Width-2; + H := StretchedPage.Height-2; + if FPreserveAspectRatio then + with OriginalImage.Picture.Graphic do + begin + if W * Height > H * Width then + W := H * Width div Height + else + H := W * Height div Width; + end; + if (FWidth <> W) or (FHeight <> H) then + begin + T := GetTickCount; + StretchedImage.Picture.Graphic := nil; + JclGraphics.Stretch(W, H, FResamplingFilter, 0, OriginalImage.Picture.Graphic, + StretchedImage.Picture.Bitmap); + with OriginalImage.Picture do + StatusBar.Panels[0].Text := Format('Original: %d x %d', [Width, Height]); + with StretchedImage.Picture do + StatusBar.Panels[1].Text := Format('Resized: %d x %d', [Width, Height]); + FWidth := W; + FHeight := H; + FStretchTime := GetTickCount - T; + with StretchedImage.Picture do + StatusBar.Panels[2].Text := Format('Resize time: %d msec', [FStretchTime]); + end; +end; + +procedure TStretchDemoForm.PreserveAspectRatio1Click(Sender: TObject); +begin + with Sender as TMenuItem do + begin + Checked := not Checked; + FPreserveAspectRatio := Checked; + InvalidateStretched; + end; +end; + +procedure TStretchDemoForm.LoadSelected; +begin + with FileListView do + if Selected <> nil then + LoadFile(Selected.Caption); +end; + +procedure TStretchDemoForm.PrevFile(Sender: TObject); +begin + if FileListIndex > 0 then + FileListIndex := FileListIndex - 1; + LoadSelected; +end; + +procedure TStretchDemoForm.NextFile(Sender: TObject); +begin + if FileListIndex < FileListView.Items.Count - 1 then + FileListIndex := FileListIndex + 1; + LoadSelected; +end; + +procedure TStretchDemoForm.UpdateCaption; +begin + if FileName <> '' then + Caption := Format('JCL Picture Viewer - %s', [FileName]); +end; + +procedure TStretchDemoForm.UpdateNavButtons; +begin + PrevItem.Enabled := FileListIndex > 0; + NextItem.Enabled := FileListIndex < FileListView.Items.Count - 1; + PrevItem.Enabled := FileListIndex > 0; + NextItem.Enabled := FileListIndex < FileListView.Items.Count - 1; +end; + +procedure TStretchDemoForm.FileListViewClick(Sender: TObject); +begin + LoadSelected; +end; + +procedure TStretchDemoForm.FormKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); +{$IFDEF VCL} +const + Key_Prior = VK_PRIOR; + Key_Next = VK_NEXT; +{$ENDIF VCL} +begin + case Key of + Key_Prior: + begin + PrevFile(Self); + Key := 0; + end; + Key_Next: + begin + NextFile(Self); + Key := 0; + end; + end; +end; + +procedure TStretchDemoForm.StretchedPageShow(Sender: TObject); +begin + UpdateStretched; +end; + +procedure TStretchDemoForm.UpdateStretched; +begin + if StretchedPage.Visible then + DoStretch; +end; + +procedure TStretchDemoForm.StretchedPageResize(Sender: TObject); +begin + UpdateStretched; +end; + +procedure TStretchDemoForm.InvalidateStretched; +begin + FWidth := 0; + FHeight := 0; + UpdateStretched; +end; + +{$IFDEF VCL} +procedure TStretchDemoForm.WMDropFiles(var Msg: TWMDropFiles); +begin + ProcessWMDropFiles(Msg, LoadFile); +end; +{$ENDIF VCL} + +procedure TStretchDemoForm.PageControlChanging(Sender: TObject; + var AllowChange: Boolean); +begin + if PageControl.ActivePage <> FilesPage then + FLastImagePage := PageControl.ActivePage; +end; + +{$IFDEF HasShellCtrls} +procedure TStretchDemoForm.ShellChange; +begin + UpdateFileList; +end; +{$ENDIF HasShellCtrls} + +function TStretchDemoForm.GetFileListIndex: Integer; +begin + Result := -1; + if FileListView.Selected <> nil then + Result := FileListView.Selected.Index; +end; + +procedure TStretchDemoForm.SetFileListIndex(const Value: Integer); +begin + if Value < 0 then + begin + if FileListView.Selected <> nil then + begin + FileListView.Selected.Selected := False; + end; + end + else + FileListView.Items[Value].Selected := True; +end; + +procedure TStretchDemoForm.FileListViewKeyDown(Sender: TObject; + var Key: Word; Shift: TShiftState); +begin + if Key = VK_RETURN then + LoadSelected; +end; + +procedure TStretchDemoForm.SetFileName(const Value: string); +begin + FFileName := PathGetLongName(Value); +end; + +end. diff --git a/official/1.100/examples/common/graphics/StretchGraphicExample.dof b/official/1.100/examples/common/graphics/StretchGraphicExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/common/graphics/StretchGraphicExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/common/graphics/StretchGraphicExample.dpr b/official/1.100/examples/common/graphics/StretchGraphicExample.dpr new file mode 100644 index 0000000..491af7b --- /dev/null +++ b/official/1.100/examples/common/graphics/StretchGraphicExample.dpr @@ -0,0 +1,16 @@ +program StretchGraphicExample; + +{$I jcl.inc} + +uses + Forms, + StretchGraphicDemoMain in 'StretchGraphicDemoMain.pas' {StretchDemoForm}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TStretchDemoForm, StretchDemoForm); + Application.Run; +end. diff --git a/official/1.100/examples/common/graphics/StretchGraphicExample.res b/official/1.100/examples/common/graphics/StretchGraphicExample.res new file mode 100644 index 0000000000000000000000000000000000000000..093026528930ea46204ac34ba193dc8155a7cef9 GIT binary patch literal 876 zcmd^8F%H5o47>tT7X%&H$;ikL05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpUIhDH*sO#C6pBW7ZVvRaH6Zi&oq?VoMY-*|X+uqINP;fNg$I1ziCnfrL13z>!j L&Q&@UGDQWRn6_4} literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/multimedia/MidiOutExample.dof b/official/1.100/examples/common/multimedia/MidiOutExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/common/multimedia/MidiOutExample.dpr b/official/1.100/examples/common/multimedia/MidiOutExample.dpr new file mode 100644 index 0000000..c45a25f --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExample.dpr @@ -0,0 +1,16 @@ +program MidiOutExample; + +uses + Forms, + MidiOutExampleMain in 'MidiOutExampleMain.pas' {Keyboard}, + MidiOutExampleTuningDlg in 'MidiOutExampleTuningDlg.pas' {TuningDialog}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TKeyboard, Keyboard); + Application.CreateForm(TTuningDialog, TuningDialog); + Application.Run; +end. diff --git a/official/1.100/examples/common/multimedia/MidiOutExample.res b/official/1.100/examples/common/multimedia/MidiOutExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/multimedia/MidiOutExampleMain.dfm b/official/1.100/examples/common/multimedia/MidiOutExampleMain.dfm new file mode 100644 index 0000000..4a2b7cc --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExampleMain.dfm @@ -0,0 +1,488 @@ +object Keyboard: TKeyboard + Left = 145 + Top = 347 + ClientWidth = 520 + ClientHeight = 223 + HorzScrollBar.Range = 517 + VertScrollBar.Range = 209 + ActiveControl = MidiProgramNum + AutoScroll = False + Caption = 'MIDI Example' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = 11 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + OldCreateOrder = True + ShowHint = True + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Key48: TSpeedButton + Tag = 48 + Left = 4 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 48 + OnMouseDown = KeyMouseDown + end + object Key50: TSpeedButton + Tag = 50 + Left = 24 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 50 + OnMouseDown = KeyMouseDown + end + object Key52: TSpeedButton + Tag = 52 + Left = 44 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 52 + OnMouseDown = KeyMouseDown + end + object Key53: TSpeedButton + Tag = 53 + Left = 64 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 53 + OnMouseDown = KeyMouseDown + end + object Key49: TSpeedButton + Tag = 49 + Left = 18 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 49 + OnMouseDown = KeyMouseDown + end + object Key51: TSpeedButton + Tag = 51 + Left = 38 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 51 + OnMouseDown = KeyMouseDown + end + object Key55: TSpeedButton + Tag = 55 + Left = 84 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 55 + OnMouseDown = KeyMouseDown + end + object Key57: TSpeedButton + Tag = 57 + Left = 104 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 57 + OnMouseDown = KeyMouseDown + end + object Key59: TSpeedButton + Tag = 59 + Left = 124 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 59 + OnMouseDown = KeyMouseDown + end + object Key54: TSpeedButton + Tag = 54 + Left = 78 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 54 + OnMouseDown = KeyMouseDown + end + object Key56: TSpeedButton + Tag = 56 + Left = 98 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 56 + OnMouseDown = KeyMouseDown + end + object Key58: TSpeedButton + Tag = 58 + Left = 118 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 58 + OnMouseDown = KeyMouseDown + end + object Key60: TSpeedButton + Tag = 60 + Left = 144 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 60 + OnMouseDown = KeyMouseDown + end + object Key62: TSpeedButton + Tag = 62 + Left = 164 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 62 + OnMouseDown = KeyMouseDown + end + object Key64: TSpeedButton + Tag = 64 + Left = 184 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 64 + OnMouseDown = KeyMouseDown + end + object Key65: TSpeedButton + Tag = 65 + Left = 204 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 65 + OnMouseDown = KeyMouseDown + end + object Key61: TSpeedButton + Tag = 61 + Left = 158 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 61 + OnMouseDown = KeyMouseDown + end + object Key63: TSpeedButton + Tag = 63 + Left = 178 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 63 + OnMouseDown = KeyMouseDown + end + object Key67: TSpeedButton + Tag = 67 + Left = 224 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 67 + OnMouseDown = KeyMouseDown + end + object Key69: TSpeedButton + Tag = 69 + Left = 244 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 69 + OnMouseDown = KeyMouseDown + end + object Key71: TSpeedButton + Tag = 71 + Left = 264 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 71 + OnMouseDown = KeyMouseDown + end + object Key66: TSpeedButton + Tag = 66 + Left = 218 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 66 + OnMouseDown = KeyMouseDown + end + object Key68: TSpeedButton + Tag = 68 + Left = 238 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 68 + OnMouseDown = KeyMouseDown + end + object Key70: TSpeedButton + Tag = 70 + Left = 258 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 70 + OnMouseDown = KeyMouseDown + end + object Key72: TSpeedButton + Tag = 72 + Left = 284 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 72 + OnMouseDown = KeyMouseDown + end + object Key74: TSpeedButton + Tag = 74 + Left = 304 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 74 + OnMouseDown = KeyMouseDown + end + object Key76: TSpeedButton + Tag = 76 + Left = 324 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 76 + OnMouseDown = KeyMouseDown + end + object Key77: TSpeedButton + Tag = 77 + Left = 344 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 77 + OnMouseDown = KeyMouseDown + end + object Key73: TSpeedButton + Tag = 73 + Left = 298 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 73 + OnMouseDown = KeyMouseDown + end + object Key75: TSpeedButton + Tag = 75 + Left = 318 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 75 + OnMouseDown = KeyMouseDown + end + object Key79: TSpeedButton + Tag = 79 + Left = 364 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 79 + OnMouseDown = KeyMouseDown + end + object Key81: TSpeedButton + Tag = 81 + Left = 384 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 81 + OnMouseDown = KeyMouseDown + end + object Key83: TSpeedButton + Tag = 83 + Left = 404 + Top = 36 + Width = 21 + Height = 97 + AllowAllUp = True + GroupIndex = 83 + OnMouseDown = KeyMouseDown + end + object Key78: TSpeedButton + Tag = 78 + Left = 358 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 78 + OnMouseDown = KeyMouseDown + end + object Key80: TSpeedButton + Tag = 80 + Left = 378 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 80 + OnMouseDown = KeyMouseDown + end + object Key82: TSpeedButton + Tag = 82 + Left = 398 + Top = 36 + Width = 13 + Height = 61 + AllowAllUp = True + GroupIndex = 82 + OnMouseDown = KeyMouseDown + end + object Label1: TLabel + Left = 440 + Top = 36 + Width = 75 + Height = 13 + Caption = 'MIDI Program #' + end + object Label2: TLabel + Left = 8 + Top = 12 + Width = 43 + Height = 13 + Caption = 'MIDI Out' + end + object Label3: TLabel + Left = 8 + Top = 144 + Width = 58 + Height = 13 + Caption = 'Pitch Wheel' + FocusControl = PitchBender + end + object Label4: TLabel + Left = 8 + Top = 184 + Width = 58 + Height = 13 + Caption = 'Mod. Wheel' + FocusControl = ModWheel + end + object MidiProgramNum: TSpinEdit + Left = 440 + Top = 60 + Width = 77 + Height = 22 + MaxValue = 127 + MinValue = 0 + TabOrder = 0 + Value = 0 + OnChange = MidiProgramNumChange + end + object PitchBender: TTrackBar + Left = 72 + Top = 136 + Width = 441 + Height = 33 + Hint = 'Pitch bender' + Max = 8191 + Min = -8192 + Orientation = trHorizontal + PageSize = 256 + Frequency = 2048 + Position = 0 + SelEnd = 0 + SelStart = 0 + TabOrder = 1 + TickMarks = tmBottomRight + TickStyle = tsAuto + OnChange = PitchBenderChange + end + object btnAllNotesOff: TButton + Left = 440 + Top = 104 + Width = 75 + Height = 25 + Caption = '&All Notes Off' + TabOrder = 2 + OnClick = btnAllNotesOffClick + end + object cbMidiOutSelect: TComboBox + Left = 68 + Top = 8 + Width = 253 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 3 + OnChange = cbMidiOutSelectChange + end + object ModWheel: TTrackBar + Left = 73 + Top = 176 + Width = 440 + Height = 33 + Hint = 'Pitch bender' + Max = 16383 + Orientation = trHorizontal + PageSize = 256 + Frequency = 2048 + Position = 0 + SelEnd = 0 + SelStart = 0 + TabOrder = 4 + TickMarks = tmBottomRight + TickStyle = tsAuto + OnChange = ModWheelChange + end + object KeyMenu: TPopupMenu + Left = 336 + Top = 8 + object TuningItem: TMenuItem + Caption = 'Tuning...' + OnClick = TuningItemClick + end + end +end diff --git a/official/1.100/examples/common/multimedia/MidiOutExampleMain.pas b/official/1.100/examples/common/multimedia/MidiOutExampleMain.pas new file mode 100644 index 0000000..ed0e4a8 --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExampleMain.pas @@ -0,0 +1,194 @@ +// +// by Robert Rossmair, June 5 2002 +// +unit MidiOutExampleMain; + +interface + +uses + SysUtils, Classes, Controls, Forms, Menus, StdCtrls, ComCtrls, Buttons, Spin, + JclMIDI; + +type + TKeyboard = class(TForm) + Key48: TSpeedButton; + Key49: TSpeedButton; + Key51: TSpeedButton; + Key50: TSpeedButton; + Key55: TSpeedButton; + Key54: TSpeedButton; + Key53: TSpeedButton; + Key52: TSpeedButton; + Key58: TSpeedButton; + Key56: TSpeedButton; + Key59: TSpeedButton; + Key57: TSpeedButton; + MidiProgramNum: TSpinEdit; + Label1: TLabel; + KeyMenu: TPopupMenu; + TuningItem: TMenuItem; + Key72: TSpeedButton; + Key74: TSpeedButton; + Key76: TSpeedButton; + Key77: TSpeedButton; + Key73: TSpeedButton; + Key75: TSpeedButton; + Key79: TSpeedButton; + Key81: TSpeedButton; + Key83: TSpeedButton; + Key78: TSpeedButton; + Key80: TSpeedButton; + Key82: TSpeedButton; + Key60: TSpeedButton; + Key62: TSpeedButton; + Key64: TSpeedButton; + Key65: TSpeedButton; + Key61: TSpeedButton; + Key63: TSpeedButton; + Key67: TSpeedButton; + Key69: TSpeedButton; + Key71: TSpeedButton; + Key66: TSpeedButton; + Key68: TSpeedButton; + Key70: TSpeedButton; + PitchBender: TTrackBar; + btnAllNotesOff: TButton; + cbMidiOutSelect: TComboBox; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + ModWheel: TTrackBar; + procedure FormCreate(Sender: TObject); + procedure KeyMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure KeyMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + procedure MidiProgramNumChange(Sender: TObject); + procedure TuningItemClick(Sender: TObject); + procedure PitchBenderChange(Sender: TObject); + procedure KeyClick(Sender: TObject); + procedure btnAllNotesOffClick(Sender: TObject); + procedure cbMidiOutSelectChange(Sender: TObject); + procedure ModWheelChange(Sender: TObject); + private + FMidiOut: IJclMidiOut; + FChannel: TMidiChannel; + Keys: array[TMidiNote] of TSpeedButton; + procedure InitKeyboard; + procedure AllNotesOff; + end; + +var + Keyboard: TKeyboard; + +implementation + +uses MidiOutExampleTuningDlg; + +{$R *.dfm} + +procedure TKeyboard.FormCreate(Sender: TObject); +begin + FChannel := 1; + GetMidiOutputs(cbMidiOutSelect.Items); + cbMidiOutSelect.ItemIndex := 0; + cbMidiOutSelectChange(Self); + InitKeyboard; +end; + +procedure TKeyboard.InitKeyboard; +var + Note: TMidiNote; +begin + for Note := Low(Keys) to High(Keys) do + begin + Keys[Note] := FindComponent(Format('Key%d', [Note])) as TSpeedButton; + if Keys[Note] <> nil then + with Keys[Note] do + begin + PopupMenu := KeyMenu; + Hint := Format('MIDI Note #%d'#13#10'%s', [Tag, MidiNoteToStr(Tag)]); + end; + end; +end; + +procedure TKeyboard.AllNotesOff; +var + Note: TMidiNote; +begin + if Assigned(FMidiOut) then + FMidiOut.SwitchAllNotesOff(FChannel); + for Note := Low(Note) to High(Note) do + if Assigned(Keys[Note]) then + Keys[Note].Down := False; +end; + +procedure TKeyboard.KeyMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Button = mbLeft then + if (Sender as TSpeedButton).Down then + FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127) + else + FMidiOut.SendNoteOn(FChannel, TComponent(Sender).Tag, 127); +end; + +procedure TKeyboard.KeyMouseUp( + Sender: TObject; + Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Button = mbLeft then + FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127); +end; + +procedure TKeyboard.MidiProgramNumChange(Sender: TObject); +begin + FMidiOut.SendProgramChange(FChannel, MidiProgramNum.Value); +end; + +procedure TKeyboard.TuningItemClick(Sender: TObject); +begin + with TuningDialog do + begin + MIDIKey.Value := KeyMenu.PopupComponent.Tag; + if ShowModal = mrOK then + FMidiOut.SendSingleNoteTuningChange(0, 0, [MidiSingleNoteTuningData(MIDIKey.Value, MIDIFrequency)]); + end; +end; + +procedure TKeyboard.PitchBenderChange(Sender: TObject); +begin + FMidiOut.SendPitchWheelChange(FChannel, PitchBender.Position + MidiPitchWheelCenter); +end; + +procedure TKeyboard.ModWheelChange(Sender: TObject); +begin + FMidiOut.SendModulationWheelChangeHR(FChannel, ModWheel.Position); +end; + +procedure TKeyboard.KeyClick(Sender: TObject); +begin + with Sender as TSpeedButton do + begin + if Down then + FMidiOut.SendNoteOn(FChannel, TComponent(Sender).Tag, 127) + else + FMidiOut.SendNoteOff(FChannel, TComponent(Sender).Tag, 127); + end; +end; + +procedure TKeyboard.btnAllNotesOffClick(Sender: TObject); +begin + AllNotesOff; +end; + +procedure TKeyboard.cbMidiOutSelectChange(Sender: TObject); +begin + AllNotesOff; + FMidiOut := MidiOut(cbMidiOutSelect.ItemIndex); + FMidiOut.SendProgramChange(FChannel, MidiProgramNum.Value); +end; + +end. + diff --git a/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.dfm b/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.dfm new file mode 100644 index 0000000..f35bbc4 --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.dfm @@ -0,0 +1,102 @@ +object TuningDialog: TTuningDialog + Left = 245 + Top = 108 + BorderStyle = bsDialog + Caption = 'Tuning' + ClientHeight = 177 + ClientWidth = 313 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object Bevel1: TBevel + Left = 8 + Top = 8 + Width = 297 + Height = 117 + Shape = bsFrame + end + object MIDIFreqLabel: TLabel + Left = 36 + Top = 56 + Width = 110 + Height = 13 + Caption = '&MIDI relative frequency' + end + object FreqLabel: TLabel + Left = 36 + Top = 84 + Width = 84 + Height = 13 + Caption = 'Frequency [Hertz]' + end + object MIDIKeyLabel: TLabel + Left = 36 + Top = 28 + Width = 81 + Height = 13 + Caption = 'MIDI key number' + end + object NoteLabel: TLabel + Left = 224 + Top = 28 + Width = 49 + Height = 13 + Caption = 'NoteLabel' + end + object OKBtn: TButton + Left = 79 + Top = 140 + Width = 75 + Height = 25 + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end + object CancelBtn: TButton + Left = 159 + Top = 140 + Width = 75 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object MIDIFreq: TEdit + Left = 156 + Top = 52 + Width = 121 + Height = 21 + TabOrder = 2 + OnChange = MIDIFreqChange + OnExit = MIDIFreqExit + end + object FreqHertz: TEdit + Left = 156 + Top = 80 + Width = 121 + Height = 21 + TabOrder = 3 + OnChange = FreqHertzChange + OnExit = FreqHertzExit + end + object MIDIKey: TSpinEdit + Left = 156 + Top = 24 + Width = 53 + Height = 22 + MaxValue = 127 + MinValue = 0 + TabOrder = 4 + Value = 0 + OnChange = MIDIKeyChange + end +end diff --git a/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.pas b/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.pas new file mode 100644 index 0000000..7de83f5 --- /dev/null +++ b/official/1.100/examples/common/multimedia/MidiOutExampleTuningDlg.pas @@ -0,0 +1,170 @@ +// +// Robert Rossmair, 2002 +// +unit MidiOutExampleTuningDlg; + +{$I jcl.inc} + +interface + +uses + Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, + Buttons, ExtCtrls, Spin, + JclMath, JclMidi; + +type + TTuningDialog = class(TForm) + OKBtn: TButton; + CancelBtn: TButton; + Bevel1: TBevel; + MIDIFreq: TEdit; + FreqHertz: TEdit; + MIDIFreqLabel: TLabel; + FreqLabel: TLabel; + MIDIKey: TSpinEdit; + MIDIKeyLabel: TLabel; + NoteLabel: TLabel; + procedure MIDIKeyChange(Sender: TObject); + procedure MIDIFreqChange(Sender: TObject); + procedure FreqHertzChange(Sender: TObject); + procedure MIDIFreqExit(Sender: TObject); + procedure FreqHertzExit(Sender: TObject); + private + FInMIDIFreqChange: Boolean; + FInFreqHertzChange: Boolean; + FChangingFrequency: Boolean; + FChangingMidiFrequency: Boolean; + FFrequency: Single; + FMidiFrequency: Single; + procedure SetFrequency(Value: Single); + procedure SetMidiFrequency(Value: Single); + public + property Frequency: Single read FFrequency write SetFrequency; // Hertz + property MidiFrequency: Single read FMidiFrequency write SetMidiFrequency; + end; + +var + TuningDialog: TTuningDialog; + +implementation + +{$R *.dfm} + +const + HalftonesPerOctave = 12; + MiddleA = 440.0; // Hertz + MidiMiddleA = 69; // A3 = 440 Hertz + Digits = 6; + MIDIFreqMax = 127.99993896; + FreqHertzMin = 8.17579892; + FreqHertzMax = 13289.70346552; + +function Hertz(MIDINote: Extended): Extended; +begin + Hertz := TwoToY((MIDINote - MidiMiddleA) / HalftonesPerOctave) * MiddleA; +end; + +function MIDINote(Hertz: Extended): Extended; +begin + if Hertz < 1.0 then + MIDINote := Low(Integer) + else + MIDINote := LogBase2(Hertz / MiddleA) * HalftonesPerOctave + MidiMiddleA; +end; + +procedure TTuningDialog.MIDIKeyChange(Sender: TObject); +begin + MIDIFrequency := MIDIKey.Value; + NoteLabel.Caption := MidiNoteToStr(MIDIKey.Value); +end; + +procedure TTuningDialog.MIDIFreqChange(Sender: TObject); +var + F: Extended; +begin + if FInFreqHertzChange or (MIDIFreq.Text = '') then + Exit; + FInMIDIFreqChange := True; + try + {$IFDEF COMPILER6_UP} + if TryStrToFloat(MidiFreq.Text, F) then + {$ELSE} + if TextToFloat(PChar(MidiFreq.Text), F, fvExtended) then + {$ENDIF COMPILER6_UP} + MidiFrequency := F; + finally + FInMIDIFreqChange := False; + end; +end; + +procedure TTuningDialog.FreqHertzChange(Sender: TObject); +var + F: Extended; +begin + if FInMIDIFreqChange or (FreqHertz.Text = '') then + Exit; + FInFreqHertzChange := True; + try + {$IFDEF COMPILER6_UP} + if TryStrToFloat(FreqHertz.Text, F) then + {$ELSE} + if TextToFloat(PChar(FreqHertz.Text), F, fvExtended) then + {$ENDIF COMPILER6_UP} + Frequency := F; + finally + FInFreqHertzChange := False; + end; +end; + +procedure TTuningDialog.SetFrequency(Value: Single); +begin + if FChangingFrequency or (Value = Frequency) then + Exit; + FChangingFrequency := True; + try + if Value < FreqHertzMin then + Value := FreqHertzMin + else + if Value > FreqHertzMax then + Value := FreqHertzMax; + FFrequency := Value; + if not FInFreqHertzChange then + FreqHertz.Text := FloatToStrF(Value, ffFixed, 9, Digits); + MidiFrequency := MIDINote(Value); + finally + FChangingFrequency := False; + end; +end; + +procedure TTuningDialog.SetMidiFrequency(Value: Single); +begin + if FChangingMidiFrequency then + // or (Value = MidiFrequency) then + Exit; + if Value < 0 then + Value := 0 + else + if Value > MidiFreqMax then + Value := MidiFreqMax; + FChangingMidiFrequency := True; + try + FMidiFrequency := Value; + if not FInMidiFreqChange then + MIDIFreq.Text := FloatToStrF(Value, ffFixed, 9, Digits); + Frequency := Hertz(Value); + finally + FChangingMidiFrequency := False; + end; +end; + +procedure TTuningDialog.MIDIFreqExit(Sender: TObject); +begin + MIDIFreq.Text := FloatToStrF(MidiFrequency, ffFixed, 9, Digits); +end; + +procedure TTuningDialog.FreqHertzExit(Sender: TObject); +begin + FreqHertz.Text := FloatToStrF(Frequency, ffFixed, 9, Digits); +end; + +end. diff --git a/official/1.100/examples/common/numformat/QNumFormatExample.dof b/official/1.100/examples/common/numformat/QNumFormatExample.dof new file mode 100644 index 0000000..d447a0b --- /dev/null +++ b/official/1.100/examples/common/numformat/QNumFormatExample.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=../../../bin diff --git a/official/1.100/examples/common/numformat/QNumFormatExample.dpr b/official/1.100/examples/common/numformat/QNumFormatExample.dpr new file mode 100644 index 0000000..130fb9e --- /dev/null +++ b/official/1.100/examples/common/numformat/QNumFormatExample.dpr @@ -0,0 +1,16 @@ +program QNumFormatExample; + +{$I jcl.inc} + +uses + QForms, + QNumFormatExampleMain in 'QNumFormatExampleMain.pas' {MainForm}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/common/numformat/QNumFormatExample.res b/official/1.100/examples/common/numformat/QNumFormatExample.res new file mode 100644 index 0000000000000000000000000000000000000000..ff24fa70c6a61f1121dd5a43dd91ace8c388f935 GIT binary patch literal 876 zcmd^8F%H5o47>nR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/numformat/QNumFormatExampleMain.pas b/official/1.100/examples/common/numformat/QNumFormatExampleMain.pas new file mode 100644 index 0000000..e7c3c7b --- /dev/null +++ b/official/1.100/examples/common/numformat/QNumFormatExampleMain.pas @@ -0,0 +1,217 @@ +unit QNumFormatExampleMain; + +interface + +uses + Math, SysUtils, Classes, + Qt, QGraphics, QControls, QForms, QStdCtrls, QComCtrls, + JclSysUtils; + +type + TMainForm = class(TForm) + ValueEdit: TEdit; + EvalBtn: TButton; + Label1: TLabel; + RandBtn: TButton; + PrecisionEdit: TSpinEdit; + Label2: TLabel; + Output: TMemo; + BlockSeparatorSelector: TComboBox; + Label3: TLabel; + Label4: TLabel; + BlockSizeEdit: TSpinEdit; + cbShowPlusSign: TCheckBox; + Label5: TLabel; + ExpDivisionEdit: TSpinEdit; + WidthEdit: TSpinEdit; + Label6: TLabel; + cbZeroPadding: TCheckBox; + Label7: TLabel; + MultiplierSelector: TComboBox; + Label8: TLabel; + FractionDigitsEdit: TSpinEdit; + procedure EvalBtnClick(Sender: TObject); + procedure RandBtnClick(Sender: TObject); + procedure ValueEditChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure BlockSizeEditChanged(Sender: TObject; NewValue: Integer); + procedure BlockSeparatorSelectorChange(Sender: TObject); + procedure PrecisionEditChanged(Sender: TObject; NewValue: Integer); + procedure cbShowPlusSignClick(Sender: TObject); + procedure ExpDivisionEditChanged(Sender: TObject; NewValue: Integer); + procedure WidthEditChanged(Sender: TObject; NewValue: Integer); + procedure cbZeroPaddingClick(Sender: TObject); + procedure MultiplierSelectorChange(Sender: TObject); + procedure FractionDigitsEditChanged(Sender: TObject; + NewValue: Integer); + private + { Private declarations } + FNumFormat: TJclNumericFormat; + procedure Display; + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.xfm} + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FNumFormat := TJclNumericFormat.Create; + FNumFormat.ExponentDivision := ExpDivisionEdit.Value; + FNumFormat.NumberOfFractionalDigits := FractionDigitsEdit.Value; + FNumFormat.Width := WidthEdit.Value; + FNumFormat.DigitBlockSize := BlockSizeEdit.Value; + BlockSeparatorSelector.Items[0] := FNumFormat.DigitBlockSeparator; + Display; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FNumFormat.Free; +end; + +procedure TMainForm.Display; +var + Base: TNumericSystemBase; + S, Mantissa: string; + Exponent: Integer; + X: Extended; + C: TCaretPos; +begin + if not Assigned(FNumFormat) then + Exit; + X := StrToFloat(ValueEdit.Text); + FNumFormat.Precision := PrecisionEdit.Value; + Output.Lines.BeginUpdate; + try + Output.Lines.Clear; + for Base := Low(TNumericSystemBase) to High(TNumericSystemBase) do + begin + FNumFormat.Base := Base; + FNumFormat.GetMantissaExp(X, Mantissa, Exponent); + if Exponent = 0 then + S := Mantissa + else + S := Format('%s %s %d^%d', [Mantissa, FNumFormat.Multiplier, Base, Exponent]); + Output.Lines.Add(Format('Base %2d: %s', [Base, S])); + end; + C.Line := 0; + C.Col := 0; + Output.CaretPos := C; + finally + Output.Lines.EndUpdate; + end; +end; + +procedure TMainForm.EvalBtnClick(Sender: TObject); +begin + Display; +end; + +procedure TMainForm.RandBtnClick(Sender: TObject); +begin + ValueEdit.Text := FloatToStr(Power(Random * 4 -2, Random(400))); + EvalBtn.Enabled := False; + Display; +end; + +procedure TMainForm.ValueEditChange(Sender: TObject); +begin + EvalBtn.Enabled := True; +end; + +procedure TMainForm.BlockSizeEditChanged(Sender: TObject; NewValue: Integer); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.DigitBlockSize := BlockSizeEdit.Value; + Display; + end; +end; + +procedure TMainForm.BlockSeparatorSelectorChange(Sender: TObject); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.DigitBlockSeparator := AnsiChar(BlockSeparatorSelector.Text[1]); + Display; + end; +end; + +procedure TMainForm.PrecisionEditChanged(Sender: TObject; NewValue: Integer); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.Precision := PrecisionEdit.Value; + Display; + end; +end; + +procedure TMainForm.cbShowPlusSignClick(Sender: TObject); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.ShowPositiveSign := cbShowPlusSign.Checked; + Display; + end; +end; + +procedure TMainForm.ExpDivisionEditChanged(Sender: TObject; + NewValue: Integer); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.ExponentDivision := ExpDivisionEdit.Value; + Display; + end; +end; + +procedure TMainForm.WidthEditChanged(Sender: TObject; NewValue: Integer); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.Width := WidthEdit.Value; + Display; + end; +end; + +procedure TMainForm.cbZeroPaddingClick(Sender: TObject); +begin + if Assigned(FNumFormat) then + begin + if cbZeroPadding.Checked then + FNumFormat.PaddingChar := '0' + else + FNumFormat.PaddingChar := ' '; + Display; + end; +end; + +procedure TMainForm.MultiplierSelectorChange(Sender: TObject); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.Multiplier := MultiplierSelector.Text; + Display; + end; +end; + +procedure TMainForm.FractionDigitsEditChanged(Sender: TObject; + NewValue: Integer); +begin + if Assigned(FNumFormat) then + begin + FNumFormat.NumberOfFractionalDigits := FractionDigitsEdit.Value; + Display; + end; +end; + +initialization + Randomize; +end. diff --git a/official/1.100/examples/common/numformat/QNumFormatExampleMain.xfm b/official/1.100/examples/common/numformat/QNumFormatExampleMain.xfm new file mode 100644 index 0000000..ae6b4d0 --- /dev/null +++ b/official/1.100/examples/common/numformat/QNumFormatExampleMain.xfm @@ -0,0 +1,224 @@ +object MainForm: TMainForm + Left = 234 + Top = 223 + Width = 800 + Height = 581 + VertScrollBar.Range = 576 + HorzScrollBar.Range = 779 + ActiveControl = ValueEdit + Caption = 'TJclNumericFormat Example' + Color = clButton + Font.CharSet = fcsLatin2 + Font.Color = clBlack + Font.Height = 12 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpFixed + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Scaled = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + object Label1: TLabel + Left = 8 + Top = 12 + Width = 78 + Height = 15 + Caption = 'Decimal value' + end + object Label2: TLabel + Left = 320 + Top = 12 + Width = 52 + Height = 15 + Caption = 'Precision' + end + object ValueEdit: TEdit + Left = 100 + Top = 8 + Width = 149 + Height = 23 + TabOrder = 0 + Text = '123456789' + OnChange = ValueEditChange + end + object EvalBtn: TButton + Left = 704 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Evaluate' + TabOrder = 8 + OnClick = EvalBtnClick + end + object RandBtn: TButton + Left = 704 + Top = 36 + Width = 75 + Height = 25 + Caption = 'Random' + TabOrder = 9 + OnClick = RandBtnClick + end + object PrecisionEdit: TSpinEdit + Left = 380 + Top = 8 + Width = 81 + Height = 23 + Max = 64 + Min = 1 + TabOrder = 1 + Value = 9 + OnChanged = PrecisionEditChanged + end + object Output: TMemo + Left = 0 + Top = 120 + Width = 800 + Height = 461 + Align = alBottom + Anchors = [akLeft, akTop, akRight, akBottom] + Font.CharSet = fcsLatin2 + Font.Color = clBlack + Font.Height = 16 + Font.Name = 'Courier' + Font.Pitch = fpFixed + Font.Style = [] + Font.Weight = 40 + ParentFont = False + ScrollBars = ssAutoBoth + TabOrder = 12 + WordWrap = False + end + object BlockSeparatorSelector: TComboBox + Left = 632 + Top = 36 + Width = 57 + Height = 23 + Style = csDropDownList + ItemHeight = 17 + Items.Strings = ( + ',' + ' ' + '|') + ItemIndex = 0 + TabOrder = 13 + Text = ',' + OnChange = BlockSeparatorSelectorChange + end + object Label3: TLabel + Left = 504 + Top = 40 + Width = 109 + Height = 15 + Caption = 'DigitBlockSeparator' + end + object Label4: TLabel + Left = 504 + Top = 68 + Width = 78 + Height = 15 + Caption = 'DigitBlockSize' + end + object BlockSizeEdit: TSpinEdit + Left = 632 + Top = 64 + Width = 57 + Height = 23 + TabOrder = 7 + Value = 3 + OnChanged = BlockSizeEditChanged + end + object cbShowPlusSign: TCheckBox + Left = 100 + Top = 32 + Width = 149 + Height = 31 + Caption = 'Show plus sign' + TabOrder = 10 + OnClick = cbShowPlusSignClick + end + object Label5: TLabel + Left = 276 + Top = 68 + Width = 95 + Height = 15 + Caption = 'ExponentDivision' + end + object ExpDivisionEdit: TSpinEdit + Left = 380 + Top = 64 + Width = 81 + Height = 23 + Max = 12 + Min = 1 + TabOrder = 3 + Value = 3 + OnChanged = ExpDivisionEditChanged + end + object WidthEdit: TSpinEdit + Left = 380 + Top = 92 + Width = 81 + Height = 23 + TabOrder = 4 + Value = 4 + OnChanged = WidthEditChanged + end + object Label6: TLabel + Left = 340 + Top = 96 + Width = 31 + Height = 15 + Caption = 'Width' + end + object cbZeroPadding: TCheckBox + Left = 100 + Top = 64 + Width = 149 + Height = 30 + Caption = 'Zero padding' + TabOrder = 11 + OnClick = cbZeroPaddingClick + end + object Label7: TLabel + Left = 504 + Top = 12 + Width = 49 + Height = 15 + Caption = 'Multiplier' + end + object MultiplierSelector: TComboBox + Left = 632 + Top = 8 + Width = 57 + Height = 23 + Style = csDropDownList + ItemHeight = 17 + Items.Strings = ( + #215 + '*') + ItemIndex = 0 + TabOrder = 18 + Text = #215 + OnChange = MultiplierSelectorChange + end + object Label8: TLabel + Left = 260 + Top = 40 + Width = 111 + Height = 15 + Caption = 'Fractional part digits' + end + object FractionDigitsEdit: TSpinEdit + Left = 380 + Top = 36 + Width = 81 + Height = 23 + Max = 64 + TabOrder = 2 + Value = 6 + OnChanged = FractionDigitsEditChanged + end +end diff --git a/official/1.100/examples/common/pcre/PCREDemo.dof b/official/1.100/examples/common/pcre/PCREDemo.dof new file mode 100644 index 0000000..abe45c2 --- /dev/null +++ b/official/1.100/examples/common/pcre/PCREDemo.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=..\..\..\bin diff --git a/official/1.100/examples/common/pcre/PCREDemo.dpr b/official/1.100/examples/common/pcre/PCREDemo.dpr new file mode 100644 index 0000000..94dfc52 --- /dev/null +++ b/official/1.100/examples/common/pcre/PCREDemo.dpr @@ -0,0 +1,17 @@ +program PCREDemo; + +{$I jcl.inc} + +uses + Forms, + PCREDemoMain in 'PCREDemoMain.pas' {frmMain}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'JclPCRE Demo'; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/official/1.100/examples/common/pcre/PCREDemo.res b/official/1.100/examples/common/pcre/PCREDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..ff24fa70c6a61f1121dd5a43dd91ace8c388f935 GIT binary patch literal 876 zcmd^8F%H5o47>nR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/pcre/PCREDemoMain.dfm b/official/1.100/examples/common/pcre/PCREDemoMain.dfm new file mode 100644 index 0000000..6fae74a --- /dev/null +++ b/official/1.100/examples/common/pcre/PCREDemoMain.dfm @@ -0,0 +1,233 @@ +object frmMain: TfrmMain + Left = 300 + Top = 115 + ClientWidth = 462 + ClientHeight = 334 + Caption = 'JclPCRE Demo' + Color = clBtnFace + Constraints.MinHeight = 370 + Constraints.MinWidth = 470 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Shell Dlg 2' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 12 + Top = 10 + Width = 96 + Height = 13 + Caption = 'Reg&ular Expression:' + FocusControl = edRegExpr + end + object edRegExpr: TEdit + Left = 12 + Top = 24 + Width = 271 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + OnChange = edRegExprChange + end + object btnFind: TButton + Left = 292 + Top = 24 + Width = 75 + Height = 25 + Action = acFind + Anchors = [akTop, akRight] + TabOrder = 1 + end + object btnFindNext: TButton + Left = 370 + Top = 24 + Width = 75 + Height = 25 + Action = acFindNext + Anchors = [akTop, akRight] + TabOrder = 2 + end + object reFile: TMemo + Left = 12 + Top = 54 + Width = 437 + Height = 180 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Courier New' + Font.Style = [] + HideSelection = False + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 3 + WantReturns = False + WordWrap = False + end + object btnOpen: TButton + Left = 364 + Top = 294 + Width = 75 + Height = 25 + Action = acOpen + Anchors = [akRight, akBottom] + TabOrder = 4 + end + object chkIgnoreCase: TCheckBox + Left = 18 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Ignore Case' + Checked = True + State = cbChecked + TabOrder = 5 + end + object chkMultiLine: TCheckBox + Left = 18 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Multi Line' + Checked = True + State = cbChecked + TabOrder = 6 + end + object chkDotAll: TCheckBox + Left = 18 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Dot All' + TabOrder = 7 + end + object chkExtended: TCheckBox + Left = 18 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Extended' + TabOrder = 8 + end + object chkAnchored: TCheckBox + Left = 132 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Anchored' + TabOrder = 9 + end + object chkDollarEndOnly: TCheckBox + Left = 132 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Dollar End Onl&y' + TabOrder = 10 + end + object chkExtra: TCheckBox + Left = 132 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Ex&tra' + TabOrder = 11 + end + object chkNotBOL: TCheckBox + Left = 132 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not &BOL' + TabOrder = 12 + end + object chkNotEOL: TCheckBox + Left = 246 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not EO&L' + TabOrder = 13 + end + object chkUnGreedy: TCheckBox + Left = 246 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Ungreedy' + Checked = True + State = cbChecked + TabOrder = 14 + end + object chkNotEmpty: TCheckBox + Left = 246 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not Em&pty' + Checked = True + State = cbChecked + TabOrder = 15 + end + object chkUTF8: TCheckBox + Left = 246 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'UTF&8' + TabOrder = 16 + end + object sbMain: TStatusBar + Left = 0 + Top = 324 + Width = 462 + Height = 19 + Panels = < + item + Width = 50 + end> + SimplePanel = False + end + object alMain: TActionList + Left = 144 + Top = 102 + object acFind: TAction + Caption = '&Find' + ShortCut = 16454 + OnExecute = acFindExecute + end + object acFindNext: TAction + Caption = 'Find &Next' + ShortCut = 114 + OnExecute = acFindNextExecute + end + object acOpen: TAction + Caption = '&Open...' + ShortCut = 16463 + OnExecute = acOpenExecute + end + end + object odOpen: TOpenDialog + Left = 240 + Top = 120 + end +end diff --git a/official/1.100/examples/common/pcre/PCREDemoMain.pas b/official/1.100/examples/common/pcre/PCREDemoMain.pas new file mode 100644 index 0000000..c608a41 --- /dev/null +++ b/official/1.100/examples/common/pcre/PCREDemoMain.pas @@ -0,0 +1,200 @@ +unit PCREDemoMain; + +interface + +uses + Windows, Messages, + SysUtils, Classes, Forms, Dialogs, ActnList, ComCtrls, StdCtrls, Controls, + JclPCRE; + +type + TfrmMain = class(TForm) + edRegExpr: TEdit; + btnFind: TButton; + btnFindNext: TButton; + Label1: TLabel; + reFile: TMemo; + btnOpen: TButton; + alMain: TActionList; + acFind: TAction; + acFindNext: TAction; + acOpen: TAction; + odOpen: TOpenDialog; + chkIgnoreCase: TCheckBox; + chkMultiLine: TCheckBox; + chkDotAll: TCheckBox; + chkExtended: TCheckBox; + chkAnchored: TCheckBox; + chkDollarEndOnly: TCheckBox; + chkExtra: TCheckBox; + chkNotBOL: TCheckBox; + chkNotEOL: TCheckBox; + chkUnGreedy: TCheckBox; + chkNotEmpty: TCheckBox; + chkUTF8: TCheckBox; + sbMain: TStatusBar; + procedure acOpenExecute(Sender: TObject); + procedure acFindExecute(Sender: TObject); + procedure acFindNextExecute(Sender: TObject); + procedure edRegExprChange(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormCreate(Sender: TObject); + + private + { Private declarations } + RE: TJclAnsiRegEx; + FMatchIndex: integer; + procedure SelectText(Range: TJclAnsiCaptureRange); + procedure Match; + function GetUIOptions: TJclAnsiRegExOptions; + procedure UpdateUIOptions; + procedure LoadFromFile(const Filename:string); + protected + procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES; + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation +uses + ShellAPI; + +{$R *.dfm} + +procedure TfrmMain.acOpenExecute(Sender: TObject); +begin + if odOpen.Execute then + LoadFromFile(odOpen.Filename); +end; + +procedure TfrmMain.acFindExecute(Sender: TObject); +begin + FreeAndNil(RE); + RE := TJclAnsiRegEx.Create; + RE.Options := GetUIOptions; + RE.Compile(edRegExpr.Text, false, false); + FMatchIndex := 1; + Match; +end; + +procedure TfrmMain.acFindNextExecute(Sender: TObject); +begin + if RE = nil then + acFind.Execute + else + Match; +end; + +procedure TfrmMain.SelectText(Range: TJclAnsiCaptureRange); +begin + reFile.SelStart := Range.FirstPos; + reFile.SelLength := Range.LastPos - Range.FirstPos; +end; + +procedure TfrmMain.Match; +begin + RE.Options := GetUIOptions; + if not RE.Match(reFile.Lines.Text, FMatchIndex) then + begin + FreeAndNil(RE); + MessageDlg('No matches found', mtInformation, [mbOK], 0); + end + else + begin + SelectText(RE.CaptureRanges[0]); + FMatchIndex := RE.CaptureRanges[0].LastPos; + end; + UpdateUIOptions; +end; + +function TfrmMain.GetUIOptions: TJclAnsiRegExOptions; +begin + Result := []; + if chkIgnoreCase.Checked then + Include(Result, roIgnoreCase); + if chkMultiLine.Checked then + Include(Result, roMultiLine); + if chkDotAll.Checked then + Include(Result, roDotAll); + if chkExtended.Checked then + Include(Result, roExtended); + if chkAnchored.Checked then + Include(Result, roAnchored); + if chkDollarEndOnly.Checked then + Include(Result, roDollarEndOnly); + if chkExtra.Checked then + Include(Result, roExtra); + if chkNotBOL.Checked then + Include(Result, roNotBOL); + if chkNotEOL.Checked then + Include(Result, roNotEOL); + if chkUngreedy.Checked then + Include(Result, roUnGreedy); + if chkNotEmpty.Checked then + Include(Result, roNotEmpty); + if chkUTF8.Checked then + Include(Result, roUTF8); +end; + +procedure TfrmMain.UpdateUIOptions; +var + Options: TJclAnsiRegExOptions; +begin + if RE = nil then Exit; + Options := RE.Options; + chkIgnoreCase.Checked := roIgnoreCase in Options; + chkMultiLine.Checked := roMultiLine in Options; + chkDotAll.Checked := roDotAll in Options; + chkExtended.Checked := roExtended in Options; + chkAnchored.Checked := roAnchored in Options; + chkDollarEndOnly.Checked := roDollarEndOnly in Options; + chkExtra.Checked := roExtra in Options; + chkNotBOL.Checked := roNotBOL in Options; + chkNotEOL.Checked := roNotEOL in Options; + chkUngreedy.Checked := roUnGreedy in Options; + chkNotEmpty.Checked := roNotEmpty in Options; + chkUTF8.Checked := roUTF8 in Options; +end; + +procedure TfrmMain.edRegExprChange(Sender: TObject); +begin + FreeAndNil(RE); +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + FreeAndNil(RE); +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + DragAcceptFiles(Handle, True); +end; + +procedure TfrmMain.WMDropFiles(var Message: TWMDropFiles); +var + i:integer; + buf:array [0..MAX_PATH] of char; +begin + i := DragQueryFile(Message.Drop, $FFFFFFFF, nil, 0); + if i > 0 then + try + DragQueryFile(Message.Drop, 0, buf, sizeof(buf)); + if FileExists(buf) then + LoadFromFile(buf); + finally + DragFinish(Message.Drop); + end; +end; + +procedure TfrmMain.LoadFromFile(const Filename: string); +begin + reFile.Lines.LoadFromFile(Filename); + sbMain.Panels[0].Text := ' ' + Filename; +end; + +end. + diff --git a/official/1.100/examples/common/pcre/QPCREDemo.dof b/official/1.100/examples/common/pcre/QPCREDemo.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/common/pcre/QPCREDemo.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/common/pcre/QPCREDemo.dpr b/official/1.100/examples/common/pcre/QPCREDemo.dpr new file mode 100644 index 0000000..481a223 --- /dev/null +++ b/official/1.100/examples/common/pcre/QPCREDemo.dpr @@ -0,0 +1,17 @@ +program QPCREDemo; + +{$I jcl.inc} + +uses + QForms, + QPCREDemoMain in 'QPCREDemoMain.pas' {frmMain}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'JclPCRE Demo'; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/official/1.100/examples/common/pcre/QPCREDemo.res b/official/1.100/examples/common/pcre/QPCREDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..ff24fa70c6a61f1121dd5a43dd91ace8c388f935 GIT binary patch literal 876 zcmd^8F%H5o47>nR7X%&H>Bz_r05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpT7SQZjHmi0i2L$EwrQkA)>9T!WhzT)=oT+ik~|6g)` zBHp6jpWOz9kh$H7a;eE7f5rpY+=1l{mW1 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/pcre/QPCREDemoMain.pas b/official/1.100/examples/common/pcre/QPCREDemoMain.pas new file mode 100644 index 0000000..e030bfd --- /dev/null +++ b/official/1.100/examples/common/pcre/QPCREDemoMain.pas @@ -0,0 +1,176 @@ +unit QPCREDemoMain; + +interface + +uses + Types, SysUtils, Classes, + QGraphics, QControls, QForms, QDialogs, QActnList, QStdCtrls, QComCtrls, + JclPCRE, QExtCtrls; + +type + TfrmMain = class(TForm) + edRegExpr: TEdit; + btnFind: TButton; + btnFindNext: TButton; + Label1: TLabel; + reFile: TMemo; + btnOpen: TButton; + alMain: TActionList; + acFind: TAction; + acFindNext: TAction; + acOpen: TAction; + odOpen: TOpenDialog; + chkIgnoreCase: TCheckBox; + chkMultiLine: TCheckBox; + chkDotAll: TCheckBox; + chkExtended: TCheckBox; + chkAnchored: TCheckBox; + chkDollarEndOnly: TCheckBox; + chkExtra: TCheckBox; + chkNotBOL: TCheckBox; + chkNotEOL: TCheckBox; + chkUnGreedy: TCheckBox; + chkNotEmpty: TCheckBox; + chkUTF8: TCheckBox; + sbMain: TStatusBar; + procedure acOpenExecute(Sender: TObject); + procedure acFindExecute(Sender: TObject); + procedure acFindNextExecute(Sender: TObject); + procedure edRegExprChange(Sender: TObject); + procedure FormDestroy(Sender: TObject); + + private + { Private declarations } + RE: TJclAnsiRegEx; + FMatchIndex: integer; + procedure SelectText(Offset: TJclAnsiCaptureOffset); + procedure Match; + function GetUIOptions: TJclAnsiRegExOptions; + procedure UpdateUIOptions; + procedure LoadFromFile(const Filename:string); + protected + //procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES; + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.xfm} + +procedure TfrmMain.acOpenExecute(Sender: TObject); +begin + if odOpen.Execute then + LoadFromFile(odOpen.Filename); +end; + +procedure TfrmMain.acFindExecute(Sender: TObject); +begin + FreeAndNil(RE); + RE := TJclAnsiRegEx.Create; + RE.Options := GetUIOptions; + RE.Compile(edRegExpr.Text, false, false); + FMatchIndex := 1; + Match; +end; + +procedure TfrmMain.acFindNextExecute(Sender: TObject); +begin + if RE = nil then + acFind.Execute + else + Match; +end; + +procedure TfrmMain.SelectText(Offset: TJclAnsiCaptureOffset); +begin + reFile.SelStart := Offset.FirstPos; + reFile.SelLength := Offset.LastPos - Offset.FirstPos; +end; + +procedure TfrmMain.Match; +begin + RE.Options := GetUIOptions; + if not RE.Match(reFile.Lines.Text, FMatchIndex) then + begin + FreeAndNil(RE); + MessageDlg('No matches found', mtInformation, [mbOK], 0); + end + else + begin + SelectText(RE.CaptureOffset[0]); + FMatchIndex := RE.CaptureOffset[0].LastPos; + end; + UpdateUIOptions; +end; + +function TfrmMain.GetUIOptions: TJclAnsiRegExOptions; +begin + Result := []; + if chkIgnoreCase.Checked then + Include(Result, roIgnoreCase); + if chkMultiLine.Checked then + Include(Result, roMultiLine); + if chkDotAll.Checked then + Include(Result, roDotAll); + if chkExtended.Checked then + Include(Result, roExtended); + if chkAnchored.Checked then + Include(Result, roAnchored); + if chkDollarEndOnly.Checked then + Include(Result, roDollarEndOnly); + if chkExtra.Checked then + Include(Result, roExtra); + if chkNotBOL.Checked then + Include(Result, roNotBOL); + if chkNotEOL.Checked then + Include(Result, roNotEOL); + if chkUngreedy.Checked then + Include(Result, roUnGreedy); + if chkNotEmpty.Checked then + Include(Result, roNotEmpty); + if chkUTF8.Checked then + Include(Result, roUTF8); +end; + +procedure TfrmMain.UpdateUIOptions; +var + Options: TJclAnsiRegExOptions; +begin + if RE = nil then Exit; + Options := RE.Options; + chkIgnoreCase.Checked := roIgnoreCase in Options; + chkMultiLine.Checked := roMultiLine in Options; + chkDotAll.Checked := roDotAll in Options; + chkExtended.Checked := roExtended in Options; + chkAnchored.Checked := roAnchored in Options; + chkDollarEndOnly.Checked := roDollarEndOnly in Options; + chkExtra.Checked := roExtra in Options; + chkNotBOL.Checked := roNotBOL in Options; + chkNotEOL.Checked := roNotEOL in Options; + chkUngreedy.Checked := roUnGreedy in Options; + chkNotEmpty.Checked := roNotEmpty in Options; + chkUTF8.Checked := roUTF8 in Options; +end; + +procedure TfrmMain.edRegExprChange(Sender: TObject); +begin + FreeAndNil(RE); +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + FreeAndNil(RE); +end; + +procedure TfrmMain.LoadFromFile(const Filename: string); +begin + reFile.Lines.LoadFromFile(Filename); + sbMain.Panels[0].Text := ' ' + Filename; +end; + +end. + diff --git a/official/1.100/examples/common/pcre/QPCREDemoMain.xfm b/official/1.100/examples/common/pcre/QPCREDemoMain.xfm new file mode 100644 index 0000000..711e2d9 --- /dev/null +++ b/official/1.100/examples/common/pcre/QPCREDemoMain.xfm @@ -0,0 +1,239 @@ +object frmMain: TfrmMain + Left = 300 + Top = 115 + Width = 470 + Height = 370 + VertScrollBar.Range = 68 + HorzScrollBar.Range = 343 + ActiveControl = edRegExpr + Caption = 'JclPCRE Demo' + Color = clButton + Constraints.MinHeight = 370 + Constraints.MinWidth = 470 + Font.Color = clText + Font.Height = 11 + Font.Name = 'MS Shell Dlg 2' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + TextWidth = 6 + object Label1: TLabel + Left = 12 + Top = 10 + Width = 96 + Height = 13 + Caption = 'Reg&ular Expression:' + FocusControl = edRegExpr + end + object edRegExpr: TEdit + Left = 12 + Top = 24 + Width = 271 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + OnChange = edRegExprChange + end + object btnFind: TButton + Left = 292 + Top = 24 + Width = 75 + Height = 25 + Action = acFind + Anchors = [akTop, akRight] + Caption = '&Find' + TabOrder = 1 + end + object btnFindNext: TButton + Left = 370 + Top = 24 + Width = 75 + Height = 25 + Action = acFindNext + Anchors = [akTop, akRight] + Caption = 'Find &Next' + TabOrder = 2 + end + object reFile: TMemo + Left = 12 + Top = 54 + Width = 437 + Height = 180 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Color = clText + Font.Height = 13 + Font.Name = 'Courier New' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 3 + WantReturns = False + WordWrap = False + end + object btnOpen: TButton + Left = 364 + Top = 294 + Width = 75 + Height = 25 + Action = acOpen + Anchors = [akRight, akBottom] + Caption = '&Open...' + TabOrder = 4 + end + object chkIgnoreCase: TCheckBox + Left = 18 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Ignore Case' + Checked = True + State = cbChecked + TabOrder = 5 + end + object chkMultiLine: TCheckBox + Left = 18 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Multi Line' + Checked = True + State = cbChecked + TabOrder = 6 + end + object chkDotAll: TCheckBox + Left = 18 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Dot All' + TabOrder = 7 + end + object chkExtended: TCheckBox + Left = 18 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Extended' + TabOrder = 8 + end + object chkAnchored: TCheckBox + Left = 132 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Anchored' + TabOrder = 9 + end + object chkDollarEndOnly: TCheckBox + Left = 132 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Dollar End Onl&y' + TabOrder = 10 + end + object chkExtra: TCheckBox + Left = 132 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Ex&tra' + TabOrder = 11 + end + object chkNotBOL: TCheckBox + Left = 132 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not &BOL' + TabOrder = 12 + end + object chkNotEOL: TCheckBox + Left = 246 + Top = 244 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not EO&L' + TabOrder = 13 + end + object chkUnGreedy: TCheckBox + Left = 246 + Top = 262 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = '&Ungreedy' + Checked = True + State = cbChecked + TabOrder = 14 + end + object chkNotEmpty: TCheckBox + Left = 246 + Top = 280 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'Not Em&pty' + Checked = True + State = cbChecked + TabOrder = 15 + end + object chkUTF8: TCheckBox + Left = 246 + Top = 298 + Width = 97 + Height = 17 + Anchors = [akLeft, akBottom] + Caption = 'UTF&8' + TabOrder = 16 + end + object sbMain: TStatusBar + Left = 0 + Top = 351 + Width = 470 + Height = 19 + Panels = < + item + end> + end + object alMain: TActionList + Left = 144 + Top = 102 + object acFind: TAction + Caption = '&Find' + ShortCut = 16454 + OnExecute = acFindExecute + end + object acFindNext: TAction + Caption = 'Find &Next' + ShortCut = 114 + OnExecute = acFindNextExecute + end + object acOpen: TAction + Caption = '&Open...' + ShortCut = 16463 + OnExecute = acOpenExecute + end + end + object odOpen: TOpenDialog + Title = 'Open' + Left = 240 + Top = 120 + end +end diff --git a/official/1.100/examples/common/rtti/QRTTIDemo.dof b/official/1.100/examples/common/rtti/QRTTIDemo.dof new file mode 100644 index 0000000..d447a0b --- /dev/null +++ b/official/1.100/examples/common/rtti/QRTTIDemo.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=../../../bin diff --git a/official/1.100/examples/common/rtti/QRTTIDemo.dpr b/official/1.100/examples/common/rtti/QRTTIDemo.dpr new file mode 100644 index 0000000..4937ad6 --- /dev/null +++ b/official/1.100/examples/common/rtti/QRTTIDemo.dpr @@ -0,0 +1,16 @@ +program QRTTIDemo; + +{$I jcl.inc} + +uses + QForms, + QRTTIDemoMain in 'QRTTIDemoMain.pas' {Form1}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/common/rtti/QRTTIDemo.res b/official/1.100/examples/common/rtti/QRTTIDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..3f19637fc2cd335a9f2794ef021332db9dc5888d GIT binary patch literal 1508 zcmd^8v2Gec5Pe5Z!Uc*c(i>Tp6{WCnoQHV zI%eW1%%=>hL+#Ytsl<6(xZ?EM0EMZW?0`_d->%G4}-j8{0p87`=&XmEG3Iu|kx0ZOH!PK8WSfcA2h zid$!?ovZMv7MkdAeThq+&NM?u^VNA4`5ONGBk!4t$L6vsM@mRFkD9uCQAZOKjB$ks zebl)R(BsPy-eXAAXT_9JVWlsq6><hcTEiDDz>9&9i;)cog+_cbbPN8~Bh_VIx? zO^m056x#T(K!$?JHFok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/sysinfo/QEnvironmentExample.dof b/official/1.100/examples/common/sysinfo/QEnvironmentExample.dof new file mode 100644 index 0000000..b13ef5f --- /dev/null +++ b/official/1.100/examples/common/sysinfo/QEnvironmentExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=../../../bin + diff --git a/official/1.100/examples/common/sysinfo/QEnvironmentExample.dpr b/official/1.100/examples/common/sysinfo/QEnvironmentExample.dpr new file mode 100644 index 0000000..bca047d --- /dev/null +++ b/official/1.100/examples/common/sysinfo/QEnvironmentExample.dpr @@ -0,0 +1,16 @@ +program QEnvironmentExample; + +{$I jcl.inc} + +uses + QForms, + QEnvironmentExampleMain in 'QEnvironmentExampleMain.pas' {Form1}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/common/sysinfo/QEnvironmentExample.res b/official/1.100/examples/common/sysinfo/QEnvironmentExample.res new file mode 100644 index 0000000000000000000000000000000000000000..093026528930ea46204ac34ba193dc8155a7cef9 GIT binary patch literal 876 zcmd^8F%H5o47>tT7X%&H$;ikL05LHDU&_DIp?mWPMn*;kq;R%dg$f2H7OY;JyR+3O ztpUIhDH*sO#C6pBW7ZVvRaH6Zi&oq?VoMY-*|X+uqINP;fNg$I1ziCnfrL13z>!j L&Q&@UGDQWRn6_4} literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.pas b/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.pas new file mode 100644 index 0000000..7235f04 --- /dev/null +++ b/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.pas @@ -0,0 +1,76 @@ +unit QEnvironmentExampleMain; + +interface + +uses + SysUtils, Classes, QControls, QForms, QComCtrls, + JclSysInfo; + +type + TForm1 = class(TForm) + EnvironmentView: TListView; + procedure FormCreate(Sender: TObject); + procedure EnvironmentGridSetEditText(Sender: TObject; ACol, + ARow: Integer; const Value: WideString); + procedure RefreshBtnClick(Sender: TObject); + private + { Private declarations } + procedure GetEnvironment; + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.xfm} + +procedure TForm1.FormCreate(Sender: TObject); +begin + GetEnvironment; +end; + +procedure TForm1.EnvironmentGridSetEditText(Sender: TObject; ACol, + ARow: Integer; const Value: WideString); +var + Key: string; +begin + with EnvironmentView.Items[ARow] do + begin + Key := Caption; + SetEnvironmentVar(Caption, SubItems[0]); + end; +end; + +procedure TForm1.RefreshBtnClick(Sender: TObject); +begin + GetEnvironment; +end; + +procedure TForm1.GetEnvironment; +var + I: Integer; + Key: string; + S: TStringList; +begin + S := TStringList.Create; + try + GetEnvironmentVars(S); + for I := 0 to S.Count - 1 do + begin + Key := S.Names[I]; + with EnvironmentView.Items.Add do + begin + Caption := Key; + SubItems.Add(S.Values[Key]); + end; + end; + finally + S.Free; + end; +end; + +end. + diff --git a/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.xfm b/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.xfm new file mode 100644 index 0000000..350efce --- /dev/null +++ b/official/1.100/examples/common/sysinfo/QEnvironmentExampleMain.xfm @@ -0,0 +1,46 @@ +object Form1: TForm1 + Left = 228 + Top = 165 + Width = 729 + Height = 540 + ActiveControl = EnvironmentView + Caption = 'Environment Variables' + Color = clButton + Font.CharSet = fcsLatin2 + Font.Color = clText + Font.Height = 12 + Font.Name = 'MS Sans Serif' + Font.Pitch = fpVariable + Font.Style = [] + Font.Weight = 40 + ParentFont = False + Scaled = False + OnCreate = FormCreate + PixelsPerInch = 96 + object EnvironmentView: TListView + Left = 0 + Top = 0 + Width = 729 + Height = 540 + Align = alClient + Columns = < + item + AutoSize = True + Caption = 'Environment variable' + Tag = 0 + Width = 200 + end + item + AutoSize = True + Caption = 'Value' + Tag = 0 + Width = 500 + end> + RowSelect = True + ReadOnly = True + ShowColumnSortIndicators = True + Sorted = True + TabOrder = 0 + ViewStyle = vsReport + end +end diff --git a/official/1.100/examples/common/textreader/TextReaderDemoMain.dfm b/official/1.100/examples/common/textreader/TextReaderDemoMain.dfm new file mode 100644 index 0000000..02ce337 --- /dev/null +++ b/official/1.100/examples/common/textreader/TextReaderDemoMain.dfm @@ -0,0 +1,94 @@ +object MainForm: TMainForm + Left = 275 + Top = 163 + ClientWidth = 763 + ClientHeight = 605 + Caption = 'TJclMappedTextReader class demo' + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 200 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object ReadLnLabel: TLabel + Left = 200 + Top = 16 + Width = 64 + Height = 13 + Caption = 'ReadLnLabel' + end + object TextListView: TListView + Left = 0 + Top = 40 + Width = 763 + Height = 555 + Anchors = [akLeft, akTop, akRight, akBottom] + Columns = < + item + Caption = 'Text' + Width = 750 + end> + ColumnClick = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + HotTrackStyles = [] + OwnerData = True + ReadOnly = True + RowSelect = True + ParentFont = False + TabOrder = 0 + ViewStyle = vsReport + OnData = TextListViewData + end + object OpenBtn: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Open file' + TabOrder = 1 + OnClick = OpenBtnClick + end + object StatusBar: TStatusBar + Left = 0 + Top = 595 + Width = 763 + Height = 19 + Panels = < + item + Width = 210 + end + item + Width = 210 + end + item + Width = 50 + end> + SimplePanel = False + end + object ReadLnBtn: TButton + Left = 112 + Top = 8 + Width = 75 + Height = 25 + Caption = 'ReadLn test' + TabOrder = 3 + OnClick = ReadLnBtnClick + end + object OpenDialog: TOpenDialog + Filter = 'Text files (*.txt)|*.txt|All files (*.*)|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 8 + Top = 552 + end +end diff --git a/official/1.100/examples/common/textreader/TextReaderDemoMain.pas b/official/1.100/examples/common/textreader/TextReaderDemoMain.pas new file mode 100644 index 0000000..085cf83 --- /dev/null +++ b/official/1.100/examples/common/textreader/TextReaderDemoMain.pas @@ -0,0 +1,153 @@ +unit TextReaderDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, ComCtrls, StdCtrls, JclFileUtils; + +type + TMainForm = class(TForm) + TextListView: TListView; + OpenDialog: TOpenDialog; + OpenBtn: TButton; + StatusBar: TStatusBar; + ReadLnBtn: TButton; + ReadLnLabel: TLabel; + procedure FormDestroy(Sender: TObject); + procedure TextListViewData(Sender: TObject; Item: TListItem); + procedure OpenBtnClick(Sender: TObject); + procedure ReadLnBtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + FFileName: string; + FTextReader: TJclMappedTextReader; + public + procedure ClearLabels; + procedure OpenFile(const FileName: string); + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +uses + JclCounter, JclSysUtils; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + ClearLabels; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FTextReader); +end; + +procedure TMainForm.ClearLabels; +begin + ReadLnLabel.Caption := ''; +end; + +procedure TMainForm.OpenFile(const FileName: string); +var + C: TJclCounter; + LineCount: Integer; + LineCountTime: Extended; +begin + FreeAndNil(FTextReader); + FFileName := ''; + TextListView.Items.Count := 0; + StatusBar.Panels[0].Text := ''; + StatusBar.Panels[1].Text := ''; + ClearLabels; + FTextReader := TJclMappedTextReader.Create(FileName); + FFileName := FileName; + StartCount(C); + LineCount := FTextReader.LineCount; + LineCountTime := StopCount(C); + TextListView.Items.Count := LineCount; + TextListView.Invalidate; + StatusBar.Panels[0].Text := ExtractFileName(FileName); + StatusBar.Panels[1].Text := Format('Lines: %d, Counting time: %.2f ms', [LineCount, LineCountTime * 1000]); +end; + +procedure TMainForm.TextListViewData(Sender: TObject; Item: TListItem); +begin + with Item, FTextReader do + Caption := Lines[Item.Index]; +end; + +procedure TMainForm.OpenBtnClick(Sender: TObject); +begin + with OpenDialog do + begin + FileName := ''; + if Execute then + OpenFile(FileName); + end; +end; + +procedure TMainForm.ReadLnBtnClick(Sender: TObject); +var + C: TJclCounter; + TotalTime, StringListTotalTime, AssignFileTotalTime: Extended; + LineCount, I: Integer; + S: string; + Reader: TJclMappedTextReader; + SL: TStringList; + T: TextFile; +begin + if FFileName = '' then + Exit; + Screen.Cursor := crHourGlass; + try + ClearLabels; + // TJclMappedTextReader + LineCount := 0; + StartCount(C); + Reader := TJclMappedTextReader.Create(FFileName); + try + Reader.GoBegin; + while not Reader.Eof do + begin + S := Reader.ReadLn; + Inc(LineCount); + end; + TotalTime := StopCount(C); + finally + Reader.Free; + end; + // TStringList + SL := TStringList.Create; + try + StartCount(C); + SL.LoadFromFile(FFileName); + for I := 0 to SL.Count - 1 do + S := SL[I]; + StringListTotalTime := StopCount(C); + finally + SL.Free; + end; + // AssignFile + StartCount(C); + AssignFile(T, FFileName); + Reset(T); + while not Eof(T) do + ReadLn(T, S); + AssignFileTotalTime := StopCount(C); + CloseFile(T); + + ReadLnLabel.Caption := Format('Lines: %d, TJclMappedTextReader: %.2f ms, TStringList: %.2f ms, AssignFile: %.2f ms', + [LineCount, TotalTime * 1000, StringListTotalTime * 1000, AssignFileTotalTime * 1000]); + finally + Screen.Cursor := crDefault; + end; +end; + + + +end. diff --git a/official/1.100/examples/common/textreader/TextReaderExample.dof b/official/1.100/examples/common/textreader/TextReaderExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/common/textreader/TextReaderExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/common/textreader/TextReaderExample.dpr b/official/1.100/examples/common/textreader/TextReaderExample.dpr new file mode 100644 index 0000000..e4ec087 --- /dev/null +++ b/official/1.100/examples/common/textreader/TextReaderExample.dpr @@ -0,0 +1,16 @@ +program TextReaderExample; + +{$I jcl.inc} + +uses + Forms, + TextReaderDemoMain in 'TextReaderDemoMain.pas' {MainForm}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/common/textreader/TextReaderExample.res b/official/1.100/examples/common/textreader/TextReaderExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/common/unitversioning/UnitVersioningTest.dof b/official/1.100/examples/common/unitversioning/UnitVersioningTest.dof new file mode 100644 index 0000000..a45efdc --- /dev/null +++ b/official/1.100/examples/common/unitversioning/UnitVersioningTest.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=..\..\..\bin \ No newline at end of file diff --git a/official/1.100/examples/common/unitversioning/UnitVersioningTest.dpr b/official/1.100/examples/common/unitversioning/UnitVersioningTest.dpr new file mode 100644 index 0000000..fe79e66 --- /dev/null +++ b/official/1.100/examples/common/unitversioning/UnitVersioningTest.dpr @@ -0,0 +1,46 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is UnitVersioningTest.dpr. } +{ } +{ The Initial Developer of the Original Code is Uwe Schuster. } +{ Portions created by Uwe Schuster are Copyright (C) Uwe Schuster. All rights reserved. } +{ } +{ Contributor(s): } +{ Uwe Schuster (uschuster) } +{ } +{**************************************************************************************************} +{ } +{ sample for TUnitVersioning } +{ } +{ Unit owner: Uwe Schuster } +{ } +{**************************************************************************************************} + +// Last modified: $Date: 2007-04-18 19:27:51 +0200 (mer., 18 avr. 2007) $ + +program UnitVersioningTest; + +{$I jcl.inc} + +uses + Forms, + UnitVersioningTestMain in 'UnitVersioningTestMain.pas' {frmUnitVersioningTestMain}; + +{$R *.res} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmUnitVersioningTestMain, frmUnitVersioningTestMain); + Application.Run; +end. diff --git a/official/1.100/examples/common/unitversioning/UnitVersioningTest.res b/official/1.100/examples/common/unitversioning/UnitVersioningTest.res new file mode 100644 index 0000000000000000000000000000000000000000..b111060100a5f025f8352346a52aa105dda315dc GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~+s-6tVP#TUMl38+L=gfOYT+L^n{Cnvf+wW#s%rxNnLu)|%~k%6 zl$I$|i0j+gyL{lskhe2$=FRS8xdnhO;amX29sAg;>k&0dYOR)T)S?pxUE+dJsM75D z-7YQoTL`ZNskJunM9$J{ZiL4pI|=o`jj8rCvcaP 0 then + begin + if FreeLibrary(TestDLLHandle) then + TestDLLHandle := 0; + end; +end; + +procedure TfrmUnitVersioningTestMain.btnTestFindMethodsClick(Sender: TObject); +const MaxCnt = 1000; +var + UnitVersioning: TUnitVersioning; + I, Idx: Integer; + UnitVersionInfoPtr: PUnitVersionInfo; +begin + UnitVersioning := GetUnitVersioning; + for I := 1 to MaxCnt do + begin + New(UnitVersionInfoPtr); + with UnitVersionInfoPtr^ do + begin + RCSfile := Format('unit%d.pas', [I]); + Revision := ''; + Date := ''; + LogPath := ''; + Extra := ''; + Data := nil; + end; + FFindMethodsInfoPtrs.Add(UnitVersionInfoPtr); + RegisterUnitVersion(HInstance, UnitVersionInfoPtr^); + end; + if MaxCnt >= 500 then + begin + Idx := UnitVersioning.IndexOf('unit500.pas'); + if Idx <> -1 then + ShowMessage(Format('IndexOf %s = %d', [UnitVersioning.Items[Idx].RCSfile, Idx])) + else + ShowMessage('IndexOf failed'); + end; + if MaxCnt >= 600 then + begin + if Assigned(UnitVersioning.FindUnit('unit600.pas')) then + ShowMessage('FindUnit ' + UnitVersioning.FindUnit('unit600.pas').RCSfile) + else + ShowMessage('FindUnit failed'); + end; +end; + +type + TDummyUnitVersioningProvider = class(TCustomUnitVersioningProvider) + private + FUV: PUnitVersionInfo; + public + constructor Create; override; + destructor Destroy; override; + procedure LoadModuleUnitVersioningInfo(Instance: THandle); override; + end; + +constructor TDummyUnitVersioningProvider.Create; +begin + inherited Create; + FUV := nil; +end; + +destructor TDummyUnitVersioningProvider.Destroy; +begin + if Assigned(FUV) then + Dispose(FUV); + inherited Destroy; +end; + +procedure TDummyUnitVersioningProvider.LoadModuleUnitVersioningInfo(Instance: THandle); +begin + if (Instance = HInstance) and not Assigned(FUV) then + begin + New(FUV); + FUV^.RCSfile := 'DummyUnit.pas'; + FUV^.Revision := '0.12'; + FUV^.Date := ''; + FUV^.LogPath := ''; + FUV^.Extra := ''; + FUV^.Data := nil; + RegisterUnitVersion(Instance, FUV^); + end; +end; + +procedure TfrmUnitVersioningTestMain.btnTestDummyProviderClick(Sender: TObject); +var + UnitVersioning: TUnitVersioning; + Idx: Integer; +begin + UnitVersioning := GetUnitVersioning; + UnitVersioning.RegisterProvider(TDummyUnitVersioningProvider); + UnitVersioning.LoadModuleUnitVersioningInfo(HInstance); + Idx := UnitVersioning.IndexOf('DummyUnit.pas'); + if Idx <> -1 then + ShowMessage(Format('IndexOf %s=%d Revision=%s', [UnitVersioning.Items[Idx].RCSfile, + Idx, UnitVersioning.Items[Idx].Revision])) + else + ShowMessage('DummyProvider Test failed'); +end; + +procedure TfrmUnitVersioningTestMain.btnTestGetLocationInfoStrClick(Sender: TObject); +var + S: string; +begin + S := GetLocationInfoStr(@TUnitVersioning.LoadModuleUnitVersioningInfo, + False, True, True, False); + ShowMessage(S); +end; + +procedure TfrmUnitVersioningTestMain.btnShowUVContentClick(Sender: TObject); +var + I, J: Integer; + UnitVersioning: TUnitVersioning; + tnModule: TTreeNode; + LongFileName: string; +begin + UnitVersioning := GetUnitVersioning; + UnitVersioning.RegisterProvider(TJclDefaultUnitVersioningProvider); + for I := 0 to Pred(UnitVersioning.ModuleCount) do + UnitVersioning.LoadModuleUnitVersioningInfo(UnitVersioning.Modules[I].Instance); + tv.Items.BeginUpdate; + try + tv.Items.Clear; + for I := 0 to Pred(UnitVersioning.ModuleCount) do + begin + tnModule := tv.Items.Add(nil, Format('%s [%d units]', + [GetModulePath(UnitVersioning.Modules[I].Instance), UnitVersioning.Modules[I].Count])); + for J := 0 to Pred(UnitVersioning.Modules[I].Count) do + with UnitVersioning.Modules[I][J] do + begin + LongFileName := LogPath; + if LongFileName <> '' then + LongFileName := PathAddSeparator(LongFileName); + LongFileName := LongFileName + RCSfile; + tv.Items.AddChild(tnModule, Format('%s %s %s', [LongFileName, Revision, Date])); + end; + end; + finally + tv.Items.EndUpdate; + end; +end; + +procedure TfrmUnitVersioningTestMain.btnLoadDLLClick(Sender: TObject); +begin + if TestDLLHandle = 0 then + begin + TestDLLHandle := LoadLibrary(TestDLLFileName); + if TestDLLHandle = 0 then + ShowMessage(Format('Could not load %s', [TestDLLFileName])); + end; +end; + +procedure TfrmUnitVersioningTestMain.btnInsertSectionClick(Sender: TObject); +var + TestStream: TMemoryStream; + UnitList: TJclUnitVersioningList; + UnitVersionInfo: TUnitVersionInfo; + I: Integer; +begin + FreeTestDLL; + if TestDLLHandle = 0 then + begin + TestStream := TMemoryStream.Create; + try + UnitList := TJclUnitVersioningList.Create; + try + for I := 1 to 20 do + begin + with UnitVersionInfo do + begin + RCSfile := Format('unit%d.pas', [I]); + Revision := Format('0.%d', [I]); + Date := ''; + LogPath := ''; + Extra := ''; + Data := nil; + end; + UnitList.Add(UnitVersionInfo); + end; + if not InsertUnitVersioningSection(TestDLLFileName, UnitList) then + ShowMessage(Format('Inserting UnitVersion information section into %s failed', + [TestDLLFileName])); + finally + UnitList.Free; + end; + finally + TestStream.Free; + end; + end + else + ShowMessage('Can''t insert section - DLL still loaded and unload failed...'); +end; + +end. diff --git a/official/1.100/examples/dotnet/JCLNetDemo/AssemblyInfo.cs b/official/1.100/examples/dotnet/JCLNetDemo/AssemblyInfo.cs new file mode 100644 index 0000000..b67641b --- /dev/null +++ b/official/1.100/examples/dotnet/JCLNetDemo/AssemblyInfo.cs @@ -0,0 +1,67 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// +// Die allgemeinen Assemblierungsinformationen werden durch die folgenden +// Attribute gesteuert. Ändern Sie die Attributwerte, um die zu einer +// Assemblierung gehörenden Informationen zu modifizieren. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Die Versionsinformation einer Assemblierung enthält die folgenden vier Werte: +// Hauptversion +// Nebenversion +// Build-Nummer +// Revision +// Sie können alle vier Werte festlegen oder für Revision und Build-Nummer die +// Standardwerte mit '*' - wie nachfolgend gezeigt - verwenden: + +[assembly: AssemblyVersion("1.0.*")] + +// +// Zum Signieren einer Assemblierung müssen Sie einen Schlüssel angeben. Weitere Informationen +// über das Signieren von Assemblierungen finden Sie in der Microsoft .NET Framework-Dokumentation. +// Mit den folgenden Attributen steuern Sie, welcher Schlüssel für die Signatur verwendet wird. +// Hinweise: +// (*) Wenn kein Schlüssel angegeben wird, ist die Assemblierung nicht signiert. +// (*) KeyName verweist auf einen Schlüssel, der im Crypto Service Provider +// (CSP) auf Ihrem Rechner installiert wurde. KeyFile verweist auf eine +// Datei, die einen Schlüssel enthält. +// (*) Wenn sowohl der KeyFile- als auch der KeyName-Wert angegeben ist, wird +// die folgende Verarbeitung durchgeführt: +// (1) Wenn KeyName in dem CSP gefunden wird, wird dieser Schlüssel verwendet. +// (2) Wenn KeyName nicht, aber KeyFile vorhanden ist, wird der Schlüssel +// in KeyFile im CSP installiert und verwendet. +// (*) Ein KeyFile können Sie mit dem Utility sn.exe (Starker Name) erzeugen. +// Der Speicherort von KeyFile sollte relativ zum Projektausgabeverzeichnis +// %Projektverzeichnis%\bin\ angegeben werden. Wenn sich Ihr +// KeyFile z.B. im Projektverzeichnis befindet, würden Sie das Attribut +// AssemblyKeyFile folgendermaßen festlegen: +// [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Verzögerte Signatur ist eine erweiterte Option; nähere Informationen +// dazu finden Sie in der Microsoft .NET Framework-Dokumentation. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] + +// +// Verwenden Sie die folgenden Attribute zur Steuerung der COM-Sichtbarkeit Ihrer Assemblierung. +// Standardmäßig ist die gesamte Assemblierung für COM sichtbar. Die Einstellung false für ComVisible +// ist die für Ihre Assemblierung empfohlene Vorgabe. Um dann eine Klasse und ein Interface für COM +// bereitzustellen, setzen Sie jeweils ComVisible auf true. Es wird auch empfohlen das Attribut +// Guid hinzuzufügen. +// + +[assembly: ComVisible(false)] +//[assembly: Guid("")] +//[assembly: TypeLibVersion(1, 0)] + diff --git a/official/1.100/examples/dotnet/JCLNetDemo/JCLNet.FrmMain.resources b/official/1.100/examples/dotnet/JCLNetDemo/JCLNet.FrmMain.resources new file mode 100644 index 0000000000000000000000000000000000000000..791098b2b00d4f8209663980d309b85e426551a8 GIT binary patch literal 7154 zcmeHMTWl0n7(UaMz4Qi!ZrdnmK@g;6-BJn#tx4GpWwn%rT{RNIGP`@aopdhETuPUC zOR(PJg$ENv5+9U^KA0#*0x?0OJ{W>ZOiVOt6oSS;g7QRS;^jNDGwtromdipAO(!{f z&iv>5ujfDK{L_AM?6;#FA>>uGJK{M_r&4e;)f7WbQ*C0jnerK`wzo=JT2VzIrMZ!Y ztP2vgS>sfnM7Os-Kvhjp*03S!hDv*6YUnC2wztNNlqjU{qq&4K zOy!=`s#Sbfx@%>}>dqB3)V-Qnxd3ej+BQr7T162lFJEg_f+aqp@;d}M8;lD(X?tri zu}r5zor7J2s|GtdGF>6QlOM5!_K8Z07loa?jxYtS&_v}yX%RdviYkYzl)zc zeD=XFKUuLYQPH=3eaqLGk9r1&4gIsRbCrY~KxW1&2sw}bXY@}aWuL{EJtr`pi?+Lp zkUGrmLVFuLY0RxfYX*H7Z9c|Jk>anTjiDXK`%S=ogSn01e+w-RdKk1rkg*Q*chNY| zRM7VOp=Tk{$q*5UMuH?lRKk-Tqz}D7G7#qg*b{L~?~#+AuVp$Fs3r(15CCSPR5~vCnF>QS++&zouGv2OOC9E3<0(b z!Oz8BLT)dVWP_O5s%dZ()+vzR4rnk19+~umU&AN{2s57IO*4Okm}8W@ohh)axHQWK zuw)=|5RF2lMqUQv+&tqZL{5ONV#(b;M9~Rw%aH-=&cose4~1od8R`gn)qK~XoUJYM zp;$*flHr~!VRq|}Ktzy*PlOi|BFAFS!&&BL2lTmFPG5{=c}bQhs*&{~5+@8z68tm} zFQ#Dtx+IK>{aRQ`jw2(1HA-@+MWX$-nbuX6w2Y{wArGRd^p;|&#ie!{r z`TCpy>)n^n>elV4gHJkqx>O#&0pQZ9fNr_p1Kz45*CL3$gf%I3k~~~r0%Y%9`!qQS z&|Iga!X5U|OzZu2jPJGAf!_Poi6MH5W#Ru zEOcXS1CF6mAh#=HfG#NoE#*$jY<6Jd&?kT6VLf}Q*r49JZLK1Rk-SoJlot(3IIf0s zan<6!API}hs%^@=iXCOl45oZev1GGqVj5@c5Hk9ZXNU^fA)OGPj}dXKnXRV6Wv1zz zU2RQS7~#Yq9w{mF60Me!8D8h3s9hVRq@mIKHL7kLrK&1qs6U;rGoz7ODJf{IlHDka zxtg>hjqoaEHI`4OV>%mnWkX_pEyU3T%2{(Z&5Kmd@TwX7O7{3TA2)@8lTznd;VAYX zVX0bFa(2LA1=Bi3m3Y&j#U)V@%eqNiXtDcrfdKOBvCt&p;{WKvnHVlqpcVY|!_HCQp2KgC+rNy)qtUd~1%fFsZowpTHO zFE4Dj0yzt7iCFfjiZR0KcWrjsP*p0YbCaZo5sJ?oS)ZiTjwqU-3!^kHWaV0!W>Jvm zUz+mrA~Y>XycnlQ9$r_}#zHkVv8h;VKtP9gR7L_8;@6md2$YeLwvHc#@)yqq63 z*%l%<1zFH@7TLD7nA~i6=+qb}^4vDC&Z6c;*5hr1Ac{2qTCmIJ6vZMUWCdLd*gjaQ z^3-OV8nfaW<8_^?@&tXr3b92G-on@uQR_=E%cNKCaD!B8hOzJnR_bf*zC{ zglqSp9$+1AUq-~$Nh&_xU+ux&M=A&S0S|5>;V5;wGwlZGx;!h@tdA*__EI0VmUX}Y7s;gP68$Ieb zx_#yC`)RNKja;8zEBh;r)chYa@IUkIIh}}hB64L_YSRmS)&JGHnwp`U^yO;)0dx{m A3jhEB literal 0 HcmV?d00001 diff --git a/official/1.100/examples/dotnet/JCLNetDemo/JCLNet.WinForm.resources b/official/1.100/examples/dotnet/JCLNetDemo/JCLNet.WinForm.resources new file mode 100644 index 0000000000000000000000000000000000000000..35b057487727be154d1e7eb5d3115396f5d442f6 GIT binary patch literal 3602 zcmd5;&2Jk;6rW9;^=Fc%iIYk+szEIk)U}+tY0^qLq_zkKCvj`T31N-b6KB-jS!+KM z90`Gh!q=~K%Ayn5JEnO{#>nVJIu)4Wwz;B8nX{(cNuLlE1NNF&9rphw1+ue;c$ZmqBZ99 zxU-p8nPqcRtSsd6xy5`wpUY=6MOSxRi>(OeIu_NlnX22=x%M*a*3ElNtTdOF=%TiG zW8r4uI?FHLM3gD$W6)oh_HUb}&ZszTQ(USqS#+0+cCNO4 zYcWp?v?G1LDae2+R1rko5-S!|i7?b>V7U|BeYYp1Q;kjjf@iPxq#_tl3Vy!VIp(I>_4zy9IQm0S1UZMGlHe^HA(b?3W@ zU(?GoAJ2a__vf4Yh1iepRNjYc^cCEo$Iw57j_o|qG#GC~{}$#?!}t*TCd?yn-OgVm z4%sH0*d#|v#3GdJk~J7PX#rb^A=s$F_8wv6Mwp=j@`AL93u7A?eg}qU`b|`b33w>c zJq?sJVaCY5O31lkwtKMEB0s@qrhl^rCMfBUI_L@zJq|O~Jzu)yMbNUk; zN{s+ZT}sK^al)$}N)uyfe0or`mzB`s*e-85+v+ys?QMsUSPY5i7WU-G5KPaxAe$YT zcoHD28Vx}WmM|JE>d-ROhAE@r+UymZS(`h|vUrQdH9wD+ODUtlZLAcVLhmLu)96r( zVGfHq>f_#786>xN1Ey|_>B-wkCN(`Hh1_AtMRr-3D$;!=Pzb`eI=%GgX%Q~mxns0 zHPde?Lxxz= z)4t{qbyngEDGA6S?itBF03^|S`olRQ4M~%?;5k*PWwTX#!@D|jA!=|U(P&f|Y;fIr zE!NkNEsj5gaVTxXo2i)flq+f+hpQ^4F(s!aamcFp{|LjlPn>{ZLg4?H|U0X z1}3rKgw-in#jgg-II4=HB6S8n$|W@o!|0>8zriPjFBp5!yksU9NQY{nOd?X;h~ZP6 zM92p#(2Mi`R)okClv0wTRRH)TVMc~R;#Js+pR`X{SwlaOUS+)?%fM0pt#~p~ukbe- Q#4E4x8* + + + + + + + + + + + + Debug + + + + 4 + False + + JCLNet + False + True + False + False + False + TRACE + + Windows + + 285212672 + False + bin\Release + + + + False + + + + + False + + False + False + + IIS + + + + + + + + 4 + True + + JCLNet + True + False + False + False + False + TRACE;DEBUG + + Windows + + 285212672 + False + bin\Debug + + + + False + + + + + False + + False + False + + IIS + + + + + + + + + + + + + + + + + + diff --git a/official/1.100/examples/dotnet/JCLNetDemo/WinForm.cs b/official/1.100/examples/dotnet/JCLNetDemo/WinForm.cs new file mode 100644 index 0000000..4d5c6b7 --- /dev/null +++ b/official/1.100/examples/dotnet/JCLNetDemo/WinForm.cs @@ -0,0 +1,254 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +using Jedi.Jcl; +using Jedi.Jcl.Units; + +using Borland.Delphi; +using Borland.Delphi.Units; + +using Borland.Vcl; +using Borland.Vcl.Units; + +namespace JCLNet +{ + /// + /// Zusammenfassende Beschreibung für FrmMain. + /// + public class FrmMain : System.Windows.Forms.Form + { + /// + /// Erforderliche Designer-Variable. + /// + private System.ComponentModel.Container components = null; + private System.Windows.Forms.TabControl tcDemos; + private System.Windows.Forms.TabPage tpSysInfo; + private System.Windows.Forms.Button btnListProcesses; + private System.Windows.Forms.TextBox tbProcesses; + private System.Windows.Forms.ListView lvSpecialDirectories; + private System.Windows.Forms.Button btnSpecialDirectories; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.Label lbIpAddress; + private System.Windows.Forms.Label lbComputerName; + private System.Windows.Forms.Button btnQuit; + + public FrmMain() + { + // + // Erforderlich für die Unterstützung des Windows-Form-Designer + // + InitializeComponent(); + + // + // TODO: Konstruktorcode nach dem Aufruf von InitializeComponent hinzufügen + // + } + + /// + /// Ressourcen nach der Verwendung bereinigen + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer erzeugter Code + /// + /// Erforderliche Methode zur Unterstützung des Designers - + /// ändern Sie die Methode nicht mit dem Quelltext-Editor + /// + private void InitializeComponent() + { + this.tcDemos = new System.Windows.Forms.TabControl(); + this.tpSysInfo = new System.Windows.Forms.TabPage(); + this.lbComputerName = new System.Windows.Forms.Label(); + this.lbIpAddress = new System.Windows.Forms.Label(); + this.btnSpecialDirectories = new System.Windows.Forms.Button(); + this.lvSpecialDirectories = new System.Windows.Forms.ListView(); + this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.tbProcesses = new System.Windows.Forms.TextBox(); + this.btnListProcesses = new System.Windows.Forms.Button(); + this.btnQuit = new System.Windows.Forms.Button(); + this.tcDemos.SuspendLayout(); + this.tpSysInfo.SuspendLayout(); + this.SuspendLayout(); + // + // tcDemos + // + this.tcDemos.Controls.Add(this.tpSysInfo); + this.tcDemos.Location = new System.Drawing.Point(8, 8); + this.tcDemos.Name = "tcDemos"; + this.tcDemos.SelectedIndex = 0; + this.tcDemos.Size = new System.Drawing.Size(712, 520); + this.tcDemos.TabIndex = 2; + // + // tpSysInfo + // + this.tpSysInfo.Controls.Add(this.lbComputerName); + this.tpSysInfo.Controls.Add(this.lbIpAddress); + this.tpSysInfo.Controls.Add(this.btnSpecialDirectories); + this.tpSysInfo.Controls.Add(this.lvSpecialDirectories); + this.tpSysInfo.Controls.Add(this.tbProcesses); + this.tpSysInfo.Controls.Add(this.btnListProcesses); + this.tpSysInfo.Location = new System.Drawing.Point(4, 22); + this.tpSysInfo.Name = "tpSysInfo"; + this.tpSysInfo.Size = new System.Drawing.Size(704, 494); + this.tpSysInfo.TabIndex = 0; + this.tpSysInfo.Text = "Jedi.Jcl.JclSysInfo"; + // + // lbComputerName + // + this.lbComputerName.Location = new System.Drawing.Point(16, 384); + this.lbComputerName.Name = "lbComputerName"; + this.lbComputerName.Size = new System.Drawing.Size(208, 16); + this.lbComputerName.TabIndex = 7; + this.lbComputerName.Text = "ComputerName"; + // + // lbIpAddress + // + this.lbIpAddress.Location = new System.Drawing.Point(16, 360); + this.lbIpAddress.Name = "lbIpAddress"; + this.lbIpAddress.Size = new System.Drawing.Size(136, 16); + this.lbIpAddress.TabIndex = 6; + this.lbIpAddress.Text = "IPAddress"; + // + // btnSpecialDirectories + // + this.btnSpecialDirectories.Location = new System.Drawing.Point(560, 152); + this.btnSpecialDirectories.Name = "btnSpecialDirectories"; + this.btnSpecialDirectories.Size = new System.Drawing.Size(136, 23); + this.btnSpecialDirectories.TabIndex = 5; + this.btnSpecialDirectories.Text = "Show Special Directories"; + this.btnSpecialDirectories.Click += new System.EventHandler(this.btnSpecialDirectories_Click); + // + // lvSpecialDirectories + // + this.lvSpecialDirectories.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.lvSpecialDirectories.Location = new System.Drawing.Point(8, 16); + this.lvSpecialDirectories.Name = "lvSpecialDirectories"; + this.lvSpecialDirectories.Size = new System.Drawing.Size(688, 136); + this.lvSpecialDirectories.TabIndex = 4; + this.lvSpecialDirectories.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Name"; + this.columnHeader1.Width = 100; + // + // columnHeader2 + // + this.columnHeader2.Text = "Directory"; + this.columnHeader2.Width = 450; + // + // tbProcesses + // + this.tbProcesses.Location = new System.Drawing.Point(8, 184); + this.tbProcesses.Multiline = true; + this.tbProcesses.Name = "tbProcesses"; + this.tbProcesses.Size = new System.Drawing.Size(688, 168); + this.tbProcesses.TabIndex = 3; + this.tbProcesses.Text = ""; + // + // btnListProcesses + // + this.btnListProcesses.Location = new System.Drawing.Point(560, 352); + this.btnListProcesses.Name = "btnListProcesses"; + this.btnListProcesses.Size = new System.Drawing.Size(136, 23); + this.btnListProcesses.TabIndex = 2; + this.btnListProcesses.Text = "List Processes"; + this.btnListProcesses.Click += new System.EventHandler(this.btnListProcesses_Click); + // + // btnQuit + // + this.btnQuit.Location = new System.Drawing.Point(640, 536); + this.btnQuit.Name = "btnQuit"; + this.btnQuit.TabIndex = 3; + this.btnQuit.Text = "&Quit"; + this.btnQuit.Click += new System.EventHandler(this.btnQuit_Click); + // + // FrmMain + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(728, 566); + this.Controls.Add(this.btnQuit); + this.Controls.Add(this.tcDemos); + this.Name = "FrmMain"; + this.Text = "JCL.NET Demo application"; + this.Load += new System.EventHandler(this.FrmMain_Load); + this.tcDemos.ResumeLayout(false); + this.tpSysInfo.ResumeLayout(false); + this.ResumeLayout(false); + } + #endregion + + /// + /// Der Haupteintrittspunkt für die Anwendung. + /// + [STAThread] + static void Main() + { + Application.Run(new FrmMain()); + } + + private void btnListProcesses_Click(object sender, System.EventArgs e) + { + TStrings list = new TStringList(); + JclSysInfo.RunningProcessesList(list, true); + tbProcesses.Lines = JclStrings.ArrayOf(list); + } + + private void btnSpecialDirectories_Click(object sender, System.EventArgs e) + { + lvSpecialDirectories.Items.Clear(); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"AppdataFolder", JclSysInfo.GetAppdataFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CommonAppdataFolder", JclSysInfo.GetCommonAppdataFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CommonDesktopdirectoryFolder", JclSysInfo.GetCommonDesktopdirectoryFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CommonFavoritesFolder", JclSysInfo.GetCommonFavoritesFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CommonProgramsFolder", JclSysInfo.GetCommonProgramsFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CookiesFolder", JclSysInfo.GetCookiesFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"CurrentFolder", JclSysInfo.GetCurrentFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"DesktopDirectoryFolder", JclSysInfo.GetDesktopDirectoryFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"DesktopFolder", JclSysInfo.GetDesktopFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"FavoritesFolder", JclSysInfo.GetFavoritesFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"HistoryFolder", JclSysInfo.GetHistoryFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"InternetCacheFolder", JclSysInfo.GetInternetCacheFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"PersonalFolder", JclSysInfo.GetPersonalFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"ProgramFilesFolder", JclSysInfo.GetProgramFilesFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"ProgramsFolder", JclSysInfo.GetProgramsFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"RecentFolder", JclSysInfo.GetRecentFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"SendToFolder", JclSysInfo.GetSendToFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"StartmenuFolder", JclSysInfo.GetStartmenuFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"StartupFolder", JclSysInfo.GetStartupFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"TemplatesFolder", JclSysInfo.GetTemplatesFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"WindowsSystemFolder", JclSysInfo.GetWindowsSystemFolder()})); + lvSpecialDirectories.Items.Add(new ListViewItem(new string[] {"WindowsTempFolder", JclSysInfo.GetWindowsTempFolder()})); + } + + private void FrmMain_Load(object sender, System.EventArgs e) + { + lbIpAddress.Text = "IP: " + JclSysInfo.GetIPAddress(JclSysInfo.GetLocalComputerName()); + lbComputerName.Text = "Machine Name: " + JclSysInfo.GetLocalComputerName(); + } + + private void btnQuit_Click(object sender, System.EventArgs e) + { + Application.Exit(); + } + + } +} diff --git a/official/1.100/examples/dotnet/JCLNetDemo/WinForm.resx b/official/1.100/examples/dotnet/JCLNetDemo/WinForm.resx new file mode 100644 index 0000000..d42084d --- /dev/null +++ b/official/1.100/examples/dotnet/JCLNetDemo/WinForm.resx @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + False + + + True + + + Private + + + 8, 8 + + + False + + + True + + + True + + + Private + + + 8, 8 + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + Private + + + False + + + (Default) + + + False + + + False + + + 8, 8 + + + True + + + 80 + + + True + + diff --git a/official/1.100/examples/k3.exc b/official/1.100/examples/k3.exc new file mode 100644 index 0000000..b273594 --- /dev/null +++ b/official/1.100/examples/k3.exc @@ -0,0 +1,48 @@ +windows/ntfs/JEDISoftLinks.dpr +windows/appinst/AppInstExample.dpr +windows/appinst/SingleInstExample.dpr +windows/asuser/CreateProcAsUserExample.dpr +windows/clr/ClrDemo.dpr +windows/debug/framestrack/FramesTrackExample.dpr +windows/debug/sourceloc/SourceLocExample.dpr +windows/debug/stacktrack/StackTrackDLLsComLibrary.dpr +windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dpr +windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dpr +windows/debug/stacktrack/StackTrackExample.dpr +windows/debug/stacktrack/StackTrackDLLsExample.dpr +windows/debug/threadexcept/ThreadExceptExample.dpr +windows/delphitools/dependencyviewer/DependView.dpr +windows/delphitools/peviewer/PeViewer.dpr +windows/delphitools/resfix/ResFix.dpr +windows/delphitools/screenjpg/ScreenJPG.dpr +windows/delphitools/toolhelpview/ToolHelpViewer.dpr +windows/edisdk/EDICOMExample.dpr +windows/edisdk/comserver/EDISDK.dpr +windows/fileversion/VerInfoExample.dpr +windows/lanman/LanManExample.dpr +windows/locales/LocalesExample.dpr +windows/mapi/MapiExample.dpr +windows/mapi/ReadMailExample.dpr +windows/multimedia/MultiMediaExample.dpr +windows/ntservice/NtSvcExample.dpr +windows/peimage/ApiHookExample.dpr +windows/peimage/PeFuncExample.dpr +windows/peimage/UnmangleNameExample.dpr +windows/registry/RegistryExample.dpr +windows/structstorage/StructStorageExample.dpr +windows/sysinfo/SysInfoExample.dpr +windows/tasks/TaskDemo.dpr +windows/ConsoleExamples.dpr +common/pcre/PCREDemo.dpr +common/expreval/ExprEvalExample.dpr +common/containers/algorithms/AlgorithmsExample.dpr +common/containers/hashing/HashingExample.dpr +common/containers/lists/ListExample.dpr +common/containers/performance/ContainerPerformance.dpr +common/containers/trees/TreeExample.dpr +common/graphics/StretchGraphicExample.dpr +common/multimedia/MidiOutExample.dpr +common/rtti/RTTIExample.dpr +common/textreader/TextReaderExample.dpr +common/unitversioning/UnitVersioningTest.dpr +common/unitversioning/UnitVersioningTestDLL.dpr \ No newline at end of file diff --git a/official/1.100/examples/visclx.exc b/official/1.100/examples/visclx.exc new file mode 100644 index 0000000..3834812 --- /dev/null +++ b/official/1.100/examples/visclx.exc @@ -0,0 +1,7 @@ +common\pcre\QPCREDemo.dpr +common\expreval\QExprEvalExample.dpr +common\filesearch\QFileSearchDemo.dpr +common\graphics\QClipLineDemo.dpr +common\numformat\QNumFormatExample.dpr +common\rtti\QRTTIDemo.dpr +common\sysinfo\QEnvironmentExample.dpr diff --git a/official/1.100/examples/windows/ConsoleExamples.dof b/official/1.100/examples/windows/ConsoleExamples.dof new file mode 100644 index 0000000..27cbb59 --- /dev/null +++ b/official/1.100/examples/windows/ConsoleExamples.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\bin +SearchPath=$(DELPHI)\Lib\Debug; diff --git a/official/1.100/examples/windows/ConsoleExamples.dpr b/official/1.100/examples/windows/ConsoleExamples.dpr new file mode 100644 index 0000000..f21652b --- /dev/null +++ b/official/1.100/examples/windows/ConsoleExamples.dpr @@ -0,0 +1,409 @@ +program ConsoleExamples; + +{$APPTYPE CONSOLE} + +{$I jcl.inc} +{$IFDEF SUPPORTS_PLATFORM_WARNINGS} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF SUPPORTS_PLATFORM_WARNINGS} + +uses + SysUtils, + Windows, + TypInfo, + JclConsole; + +{$R ..\..\source\windows\JclNoDepAsInvoker.res} + +type + TCPInfoEx = packed record + MaxCharSize: DWORD; + DefaultChar: array[0..MAX_DEFAULTCHAR-1] of Byte; + LeadByte: array[0..MAX_LEADBYTES-1] of Byte; + UnicodeDefaultChar: WideChar; + CodePage: DWORD; + CodePageName: array[0..MAX_PATH-1] of Char; + end; + +function GetCPInfoEx(CodePage, dwFlags: DWORD; var lpCPInfoEx: TCPInfoEx): BOOL; stdcall; + external 'kernel32.dll' name 'GetCPInfoExA'; + +procedure ShowConsoleInfo(const Console: TJclConsole); + function CodePageToName(CodePage: DWORD): string; + var + CpInfo: TCPInfoEx; + begin + Win32Check(GetCPInfoEx(CodePage, 0, CpInfo)); + Result := CpInfo.CodePageName; + end; +begin + Assert(TJclConsole.IsConsole(GetModuleHandle(nil))); + Assert(TJclConsole.IsConsole(ParamStr(0))); + + Console.ActiveScreen.WriteLn('Old Windows Title : ' + Console.Title); + Console.Title := 'Information of the Default Output Screen Buffer'; + Console.ActiveScreen.WriteLn('New Windows Title : ' + Console.Title); + Console.ActiveScreen.WriteLn(Format('Input Code Page : %s', [CodePageToName(Console.InputCodePage)])); + Console.ActiveScreen.WriteLn(Format('Output Code Page : %s', [CodePageToName(Console.OutputCodePage)])); +end; + +procedure ShowScreenInfo(const ScrBuf: TJclScreenBuffer); + function ModeToString: string; + var + AMode: TJclConsoleOutputMode; + begin + for AMode:=Low(TJclConsoleOutputMode) to High(TJclConsoleOutputMode) do + begin + if AMode in ScrBuf.Mode then + begin + if Result <> '' then + Result := Result + ', '; + Result := Result + GetEnumName(TypeInfo(TJclConsoleOutputMode), Integer(AMode)); + end; + end; + end; +var + OldMode: TJclConsoleOutputModes; + Attr: IJclScreenTextAttribute; +begin + ScrBuf.WriteLn; + ScrBuf.WriteLn(Format('Handle: 0x%.8x', [ScrBuf.Handle])); + ScrBuf.Writeln('Old Mode : ' + ModeToString); + OldMode := ScrBuf.Mode; + ScrBuf.Mode := ScrBuf.Mode - [omWrapAtEol]; + ScrBuf.Write('New Mode : ' + ModeToString); + Readln; + ScrBuf.Mode := OldMode; + + ScrBuf.WriteLn(Format('Old Size: (%d, %d)', [ScrBuf.Width, ScrBuf.Height])); + ScrBuf.Width := ScrBuf.Width * 2; + ScrBuf.Write(Format('New Size: (%d, %d)', [ScrBuf.Width, ScrBuf.Height])); + Readln; + ScrBuf.Width := ScrBuf.Width div 2; + + Attr := TJclScreenTextAttribute.Create(fclYellow, bclBlue, True, False, + [fsGridHorizontal, fsUnderscore]); + + ScrBuf.Write('Top', thaCenter, tvaTop, Attr); + ScrBuf.Write('Bottom', thaCenter, tvaBottom, Attr); + ScrBuf.Write('Left', thaLeft, tvaCenter, Attr); + ScrBuf.Write('Right', thaRight, tvaCenter, Attr); + ScrBuf.Write('Center', thaCenter, tvaCenter, Attr); +end; + +procedure ShowCursorInfo(const ScrBuf: TJclScreenBuffer); +const + BoolName: array[Boolean] of string = ('Hide', 'Show'); +var + OldPos: TCoord; + OldSize: TJclScreenCursorSize; +begin + ScrBuf.WriteLn; + ScrBuf.WriteLn(Format('Cursor Position: (%d, %d)', [ScrBuf.Cursor.Position.X, ScrBuf.Cursor.Position.Y])); + OldPos := ScrBuf.Cursor.Position; + ScrBuf.Cursor.MoveTo(ScrBuf.Window.Left, ScrBuf.Window.Top); + ScrBuf.Write(Format('(%d, %d)', [ScrBuf.Cursor.Position.X, ScrBuf.Cursor.Position.Y])); + ScrBuf.Cursor.Position := OldPos; + Readln; + ScrBuf.WriteLn('Left-Top corner :' + ScrBuf.ReadLn(0, 0)); + + ScrBuf.WriteLn(Format('Old Cursor Size: %d', [ScrBuf.Cursor.Size])); + OldSize := ScrBuf.Cursor.Size; ScrBuf.Cursor.Size := 100; + ScrBuf.Write(Format('New Cursor Size: %d', [ScrBuf.Cursor.Size])); + Readln; + ScrBuf.Cursor.Size := OldSize; + + ScrBuf.WriteLn('Visible of Cursor: ' + BoolName[ScrBuf.Cursor.Visible]); + ScrBuf.Cursor.Visible := False; + ScrBuf.Write('Hidden Cursor: ' + BoolName[ScrBuf.Cursor.Visible]); + Readln; + ScrBuf.Cursor.Visible := True; +end; + +procedure ShowWindowInfo(const ScrBuf: TJclScreenBuffer); +var + OldPos, OldSize: TCoord; +begin + ScrBuf.WriteLn; + ScrBuf.WriteLn(Format('Largest Console Size : (%d, %d)', + [ScrBuf.Window.MaxConsoleWindowSize.X, ScrBuf.Window.MaxConsoleWindowSize.Y])); + ScrBuf.WriteLn(Format('Largest Window Size : (%d, %d)', + [ScrBuf.Window.MaxWindow.X, ScrBuf.Window.MaxWindow.Y])); + + ScrBuf.WriteLn(Format('Old Window Position : (%d, %d)', [ScrBuf.Window.Left, ScrBuf.Window.Top])); + OldPos := ScrBuf.Window.Position; + ScrBuf.Window.Left := 0; + ScrBuf.Window.Top := 0; + ScrBuf.Write(Format('New Window Position : (%d, %d)', [ScrBuf.Window.Left, ScrBuf.Window.Top])); + Readln; + ScrBuf.Window.Position := OldPos; + + ScrBuf.WriteLn(Format('Old Window Size : (%d, %d)', [ScrBuf.Window.Width, ScrBuf.Window.Height])); + OldSize := ScrBuf.Window.Size; + ScrBuf.Window.Width := ScrBuf.Window.Width div 2; + ScrBuf.Window.Height := ScrBuf.Window.Height div 2; + ScrBuf.Write(Format('New Window Size : (%d, %d)', [ScrBuf.Window.Width, ScrBuf.Window.Height])); + Readln; + ScrBuf.Window.Size := OldSize; + + ScrBuf.Write(Format('Scroll up %d line: ', [ScrBuf.Window.Top])); + Readln; + OldPos := ScrBuf.Window.Position; + ScrBuf.Window.Scroll(0, -ScrBuf.Window.Top); + Readln; + ScrBuf.Window.Position := OldPos; +end; + +procedure ShowTextAttributeInfo(const ScrBuf: TJclScreenBuffer); + function StyleToString: string; + var + AStyle: TJclScreenFontStyle; + begin + for AStyle:=Low(TJclScreenFontStyle) to High(TJclScreenFontStyle) do + begin + if AStyle in ScrBuf.Font.Style then + begin + if Result <> '' then + Result := Result + ', '; + Result := Result + GetEnumName(TypeInfo(TJclScreenFontStyle), Integer(AStyle)); + end; + end; + end; +const + HighlightName: array[Boolean] of string = ('', ' [Highlight]'); +var + OldTextAttribute: Word; +begin + ScrBuf.WriteLn('Old Font Color : ' + + GetEnumName(TypeInfo(TJclScreenFontColor), Integer(ScrBuf.Font.Color)) + + HighlightName[ScrBuf.Font.Highlight]); + ScrBuf.WriteLn('Old Back Color : ' + + GetEnumName(TypeInfo(TJclScreenBackColor), Integer(ScrBuf.Font.BgColor)) + + HighlightName[ScrBuf.Font.BgHighlight]); + ScrBuf.Writeln('Old Font Style : ' + StyleToString); + OldTextAttribute := ScrBuf.Font.TextAttribute; + ScrBuf.Font.Color := fclYellow; + ScrBuf.Font.Highlight := True; + ScrBuf.Font.BgColor := bclBlue; + ScrBuf.Font.Style := ScrBuf.Font.Style + [fsUnderscore]; + ScrBuf.WriteLn('New Font Color : ' + + GetEnumName(TypeInfo(TJclScreenFontColor), Integer(ScrBuf.Font.Color)) + + HighlightName[ScrBuf.Font.Highlight]); + ScrBuf.WriteLn('New Back Color : ' + + GetEnumName(TypeInfo(TJclScreenBackColor), Integer(ScrBuf.Font.BgColor)) + + HighlightName[ScrBuf.Font.BgHighlight]); + ScrBuf.Write('New Font Style : ' + StyleToString); + ScrBuf.Font.TextAttribute := OldTextAttribute; + ScrBuf.Writeln; +end; + +{ TCtrlEventHandler } + +type + TCtrlEventHandler = class + private + FConsole: TJclConsole; + FTerminated: Boolean; + protected + procedure OnCtrlC(Sender: TObject); + procedure OnCtrlBreak(Sender: TObject); + procedure OnClose(Sender: TObject); + procedure OnLogOff(Sender: TObject); + procedure OnShutdown(Sender: TObject); + + procedure Terminate; + public + constructor Create(AConsole: TJclConsole); + + property Console: TJclConsole read FConsole; + property Terminated: Boolean read FTerminated; + end; + +constructor TCtrlEventHandler.Create(AConsole: TJclConsole); +begin + FConsole := AConsole; + FTerminated := False; + + Console.OnCtrlC := OnCtrlC; + Console.OnCtrlBreak := OnCtrlBreak; + Console.OnClose := OnClose; + Console.OnLogOff := OnLogOff; + Console.OnShutdown := OnShutdown; +end; + +procedure TCtrlEventHandler.Terminate; +var + Evt: TInputRecord; +begin + Sleep(1000); + + FTerminated := True; + + Evt.EventType := FOCUS_EVENT; + Evt.Event.FocusEvent.bSetFocus := False; + FConsole.Input.PutEvent(Evt); +end; + +procedure TCtrlEventHandler.OnCtrlC(Sender: TObject); +begin + Console.ActiveScreen.Writeln('Ctrl Event: Ctrl-C'); +end; + +procedure TCtrlEventHandler.OnCtrlBreak(Sender: TObject); +begin + Console.ActiveScreen.Writeln('Ctrl Event: Ctrl-Break'); +end; + +procedure TCtrlEventHandler.OnClose(Sender: TObject); +begin + Console.ActiveScreen.Writeln('Ctrl Event: Close'); + Terminate; +end; + +procedure TCtrlEventHandler.OnLogOff(Sender: TObject); +begin + Console.ActiveScreen.Writeln('Ctrl Event: Logoff'); + Terminate; +end; + +procedure TCtrlEventHandler.OnShutdown(Sender: TObject); +begin + Console.ActiveScreen.Writeln('Ctrl Event: Shutdown'); + Terminate; +end; + +procedure ShowInputInfo(const InputBuf: TJclInputBuffer); + function ModeToString: string; + var + AMode: TJclConsoleInputMode; + begin + for AMode:=Low(TJclConsoleInputMode) to High(TJclConsoleInputMode) do + begin + if AMode in InputBuf.Mode then + begin + if Result <> '' then + Result := Result + ', '; + Result := Result + GetEnumName(TypeInfo(TJclConsoleInputMode), Integer(AMode)); + end; + end; + end; + + procedure AddEvent; + var + ir: TInputRecord; + begin + ir.EventType := MENU_EVENT; + ir.Event.MenuEvent.dwCommandId := 111; + InputBuf.PutEvent(ir); + end; +const + MOUSE_CLICKED = 0; + MOUSE_WHEELED = 3; + KeyDownBoolName: array[Boolean] of string = ('released', 'pressed'); + SetFocusBoolName: array[Boolean] of string = ('deactivated', 'activated'); +var + I: DWORD; + OldPos: TCoord; + CtrlEvt: TCtrlEventHandler; + ScrBuf: TJclScreenBuffer; +begin + ScrBuf := InputBuf.Console.ActiveScreen; + ScrBuf.WriteLn(Format('Input Event Count : %d', [InputBuf.EventCount])); + + InputBuf.Mode := [imProcessed, imWindow, imMouse]; + ScrBuf.Writeln('Input Mode : ' + ModeToString); + + InputBuf.Clear; + + AddEvent; + + CtrlEvt := TCtrlEventHandler.Create(InputBuf.Console); + try + ScrBuf.WriteLn('Press [q] to break the loop...'); + while not CtrlEvt.Terminated and InputBuf.WaitEvent do + begin + with InputBuf.GetEvent do + case EventType of + KEY_EVENT: + begin + ScrBuf.WriteLn(Format('Key (%s)$%.2x is %s %d times', + [Event.KeyEvent.AsciiChar, Event.KeyEvent.wVirtualKeyCode, + KeyDownBoolName[Event.KeyEvent.bKeyDown], Event.KeyEvent.wRepeatCount])); + + if Event.KeyEvent.AsciiChar = 'q' then + Break; + end; + _MOUSE_EVENT: + begin + case Event.MouseEvent.dwEventFlags of + MOUSE_CLICKED: + begin + for I:= 1 to TJclConsole.MouseButtonCount do + if (Event.MouseEvent.dwButtonState and (1 shl (I - 1))) <> 0 then + begin + ScrBuf.Write(Format('Mouse %d button click at', [I])); + Break; + end; + if I > TJclConsole.MouseButtonCount then + ScrBuf.Write('Mouse button released at'); + end; + DOUBLE_CLICK: + ScrBuf.Write('Mouse double-click at'); + MOUSE_MOVED: + begin + if (OldPos.X <> Event.MouseEvent.dwMousePosition.X) or + (OldPos.Y <> Event.MouseEvent.dwMousePosition.Y) then + begin + ScrBuf.Write('Mouse move to'); + OldPos := Event.MouseEvent.dwMousePosition; + end + else + Continue; + end; + MOUSE_WHEELED: + ScrBuf.Write('Mouse wheeled at'); + else + ScrBuf.Write('Mouse unknown action at'); + end; + + ScrBuf.WriteLn(Format(' (%d, %d) ', [Event.MouseEvent.dwMousePosition.X, Event.MouseEvent.dwMousePosition.Y])); + end; + WINDOW_BUFFER_SIZE_EVENT: + ScrBuf.WriteLn(Format('Screen buffer size is change to (%d, %d)', + [Event.WindowBufferSizeEvent.dwSize.X, Event.WindowBufferSizeEvent.dwSize.Y])); + MENU_EVENT: + ScrBuf.WriteLn(Format('Menu command %d is selected', [Event.MenuEvent.dwCommandId])); + FOCUS_EVENT: + ScrBuf.Writeln('Console window is ' + SetFocusBoolName[Event.FocusEvent.bSetFocus]); + else + ScrBuf.WriteLn(Format('Unknown event - %d', [EventType])); + end; + end; + finally + FreeAndNil(CtrlEvt); + end; +end; + +var + ScrBuf, NewScrBuf: TJclScreenBuffer; +begin + ShowConsoleInfo(TJclConsole.Default); + + ScrBuf := TJclConsole.Default.ActiveScreen; + + ShowScreenInfo(ScrBuf); + ShowCursorInfo(ScrBuf); + ShowWindowInfo(ScrBuf); + + ScrBuf.Clear; + + NewScrBuf := TJclConsole.Default.Add; + ShowTextAttributeInfo(NewScrBuf); + TJclConsole.Default.ActiveScreen := NewScrBuf; + + ShowInputInfo(TJclConsole.Default.Input); + + NewScrBuf.Clear; + + TJclConsole.Default.ActiveScreen := ScrBuf; +end. diff --git a/official/1.100/examples/windows/appinst/AppInstDemoMain.dfm b/official/1.100/examples/windows/appinst/AppInstDemoMain.dfm new file mode 100644 index 0000000..5a11a5c --- /dev/null +++ b/official/1.100/examples/windows/appinst/AppInstDemoMain.dfm @@ -0,0 +1,131 @@ +object Form1: TForm1 + Left = 204 + Top = 125 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'JclAppInst demo' + ClientHeight = 365 + ClientWidth = 329 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poDefaultPosOnly + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 256 + Top = 8 + Width = 65 + Height = 97 + Alignment = taCenter + AutoSize = False + Caption = '0' + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -96 + Font.Name = 'Arial' + Font.Style = [fsBold] + ParentFont = False + Layout = tlCenter + end + object InstancesListView: TListView + Left = 0 + Top = 0 + Width = 241 + Height = 177 + Columns = < + item + Caption = 'Number' + end + item + Alignment = taRightJustify + Caption = 'ProcessID' + Width = 70 + end + item + Alignment = taRightJustify + Caption = 'Application HWND' + Width = 110 + end> + ColumnClick = False + HideSelection = False + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnDblClick = SwitchBtnClick + end + object SwitchBtn: TButton + Left = 248 + Top = 120 + Width = 75 + Height = 25 + Caption = 'Switch to' + TabOrder = 1 + OnClick = SwitchBtnClick + end + object MsgBtn: TButton + Left = 248 + Top = 152 + Width = 75 + Height = 25 + Caption = 'Message' + TabOrder = 2 + OnClick = MsgBtnClick + end + object Memo1: TMemo + Left = 0 + Top = 184 + Width = 241 + Height = 177 + Lines.Strings = ( + 'Enter a text') + TabOrder = 3 + OnChange = Memo1Change + end + object SendBtn: TButton + Left = 248 + Top = 336 + Width = 75 + Height = 25 + Caption = 'Send' + TabOrder = 4 + OnClick = SendBtnClick + end + object AutoUpdateCheckBox: TCheckBox + Left = 248 + Top = 304 + Width = 97 + Height = 17 + Caption = 'Auto update' + TabOrder = 5 + end + object ColorDialog1: TColorDialog + Ctl3D = True + CustomColors.Strings = ( + 'ColorA=FFFFFFFF' + 'ColorB=FFFFFFFF' + 'ColorC=FFFFFFFF' + 'ColorD=FFFFFFFF' + 'ColorE=FFFFFFFF' + 'ColorF=FFFFFFFF' + 'ColorG=FFFFFFFF' + 'ColorH=FFFFFFFF' + 'ColorI=FFFFFFFF' + 'ColorJ=FFFFFFFF' + 'ColorK=FFFFFFFF' + 'ColorL=FFFFFFFF' + 'ColorM=FFFFFFFF' + 'ColorN=FFFFFFFF' + 'ColorO=FFFFFFFF' + 'ColorP=FFFFFFFF') + Options = [cdPreventFullOpen] + Left = 8 + Top = 144 + end +end diff --git a/official/1.100/examples/windows/appinst/AppInstDemoMain.pas b/official/1.100/examples/windows/appinst/AppInstDemoMain.pas new file mode 100644 index 0000000..422071b --- /dev/null +++ b/official/1.100/examples/windows/appinst/AppInstDemoMain.pas @@ -0,0 +1,169 @@ +unit AppInstDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + JclAppInst, ComCtrls, StdCtrls; + +type + TForm1 = class(TForm) + InstancesListView: TListView; + Label1: TLabel; + SwitchBtn: TButton; + MsgBtn: TButton; + ColorDialog1: TColorDialog; + Memo1: TMemo; + SendBtn: TButton; + AutoUpdateCheckBox: TCheckBox; + procedure FormCreate(Sender: TObject); + procedure SwitchBtnClick(Sender: TObject); + procedure MsgBtnClick(Sender: TObject); + procedure SendBtnClick(Sender: TObject); + procedure Memo1Change(Sender: TObject); + private + procedure BuildInstancesList; + procedure ApplicationEvents1Message(var Msg: TMsg; var Handled: Boolean); + public + procedure WndProc(var Message: TMessage); override; + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +const + MaxAllowedInstances = 3; + + MyDataKind = 1; + +{ TForm1 } + +procedure TForm1.BuildInstancesList; +var + I, CurrIndex: Integer; +begin + with InstancesListView, JclAppInstances do + begin + Items.BeginUpdate; + Items.Clear; + for I := 0 to InstanceCount -1 do + with Items.Add do + begin + Caption := IntToStr(I + 1); + SubItems.Add(Format('%.8x', [ProcessIDs[I]])); + SubItems.Add(Format('%.8x', [AppWnds[I]])); + end; + CurrIndex := InstanceIndex[GetCurrentProcessId]; + Selected := Items[CurrIndex]; + Items.EndUpdate; + end; + Label1.Caption := IntToStr(CurrIndex + 1); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + Application.OnMessage := ApplicationEvents1Message; + BuildInstancesList; +end; + +procedure TForm1.ApplicationEvents1Message(var Msg: TMsg; var Handled: Boolean); +begin + // AI_* messages handler. These messages are automatically send to all instances + // of the application. + with Msg do + if (hwnd = 0) and (message = JclAppInstances.MessageID) then + begin + case wParam of + AI_INSTANCECREATED, AI_INSTANCEDESTROYED: + BuildInstancesList; + AI_USERMSG: + Label1.Font.Color := TColor(lParam); + end; + Handled := True; + end; +end; + +procedure TForm1.SwitchBtnClick(Sender: TObject); +begin + JclAppInstances.SwitchTo(InstancesListView.Selected.Index); +end; + +procedure TForm1.MsgBtnClick(Sender: TObject); +begin + with ColorDialog1 do + begin + Color := Label1.Font.Color; + if Execute then + JclAppInstances.UserNotify(Color); + end; +end; + +procedure TForm1.SendBtnClick(Sender: TObject); +begin + // TForm.ClassName matches window class name. It sends the data to all windows + // belonging instances of this application. The last parameter identifies the + // 'TForm1' (ClassName) window of this instance. + JclAppInstances.SendStrings(ClassName, MyDataKind, Memo1.Lines, Handle); +end; + +var + MemoChanging: Boolean; + +procedure TForm1.WndProc(var Message: TMessage); +begin + // Interprocess communication handler. + + // First check whether we can safely read TForm.Handle property ... + if HandleAllocated and not (csDestroying in ComponentState) then + begin + // ... then whether it is our message. The last paramter tells to ignore the + // message sent from window of this instance + case ReadMessageCheck(Message, Handle) of + MyDataKind: // It is our data + begin + MemoChanging := True; // prevent deadlock, TMemo.OnChange is also fired now + Memo1.Lines.BeginUpdate; + try + // Read TStrings from the message + ReadMessageStrings(Message, Memo1.Lines) + finally + Memo1.Lines.EndUpdate; + MemoChanging := False; + end; + end; + else + inherited; + end; + end + else + inherited; +end; + +procedure TForm1.Memo1Change(Sender: TObject); +begin + if not MemoChanging and AutoUpdateCheckBox.Checked then + SendBtnClick(nil); +end; + +initialization + + with JclAppInstances do + // CheckInstance returns False if current instance number is greater than + // MaxAllowedInstances constant + if not CheckInstance(MaxAllowedInstances) then + begin + // Switch to the first instance of the application + SwitchTo(0); + // Close this instance + KillInstance; + end; + + // Note: For preventing more than one instance of the application you can put + // simple JclAppInstances.CheckSingleInstance line to initialization section + // instead of code above + +end. diff --git a/official/1.100/examples/windows/appinst/AppInstExample.dof b/official/1.100/examples/windows/appinst/AppInstExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/windows/appinst/AppInstExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/windows/appinst/AppInstExample.dpr b/official/1.100/examples/windows/appinst/AppInstExample.dpr new file mode 100644 index 0000000..039499b --- /dev/null +++ b/official/1.100/examples/windows/appinst/AppInstExample.dpr @@ -0,0 +1,16 @@ +program AppInstExample; + +{$I jcl.inc} + +uses + Forms, + AppInstDemoMain in 'AppInstDemoMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/appinst/AppInstExample.res b/official/1.100/examples/windows/appinst/AppInstExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/appinst/SingleInstDemoMain.dfm b/official/1.100/examples/windows/appinst/SingleInstDemoMain.dfm new file mode 100644 index 0000000..b61255e --- /dev/null +++ b/official/1.100/examples/windows/appinst/SingleInstDemoMain.dfm @@ -0,0 +1,25 @@ +object Form1: TForm1 + Left = 194 + Top = 107 + ClientWidth = 270 + ClientHeight = 145 + Caption = 'Single application instance only' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object DialogBtn: TButton + Left = 72 + Top = 48 + Width = 113 + Height = 25 + Caption = 'Show modal dialog' + TabOrder = 0 + OnClick = DialogBtnClick + end +end diff --git a/official/1.100/examples/windows/appinst/SingleInstDemoMain.pas b/official/1.100/examples/windows/appinst/SingleInstDemoMain.pas new file mode 100644 index 0000000..1344a63 --- /dev/null +++ b/official/1.100/examples/windows/appinst/SingleInstDemoMain.pas @@ -0,0 +1,34 @@ +unit SingleInstDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TForm1 = class(TForm) + DialogBtn: TButton; + procedure DialogBtnClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +// See Project file source (SingleInstExample.dpr) for added single instance +// checking code. + +procedure TForm1.DialogBtnClick(Sender: TObject); +begin + ShowMessage('This is a modal dialog.'); +end; + +end. diff --git a/official/1.100/examples/windows/appinst/SingleInstExample.dof b/official/1.100/examples/windows/appinst/SingleInstExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/windows/appinst/SingleInstExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/windows/appinst/SingleInstExample.dpr b/official/1.100/examples/windows/appinst/SingleInstExample.dpr new file mode 100644 index 0000000..1160492 --- /dev/null +++ b/official/1.100/examples/windows/appinst/SingleInstExample.dpr @@ -0,0 +1,18 @@ +program SingleInstExample; + +{$I jcl.inc} + +uses + JclAppInst, // Added JclAppInst unit + Forms, + SingleInstDemoMain in 'SingleInstDemoMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + JclAppInstances.CheckSingleInstance; // Added instance checking + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/appinst/SingleInstExample.res b/official/1.100/examples/windows/appinst/SingleInstExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.dfm b/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.dfm new file mode 100644 index 0000000..99ef677 --- /dev/null +++ b/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.dfm @@ -0,0 +1,194 @@ +object Form1: TForm1 + Left = 386 + Top = 230 + ClientWidth = 390 + ClientHeight = 344 + Caption = 'CreateProcAsUser Demo' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 47 + Height = 13 + Caption = 'Domain:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label2: TLabel + Left = 136 + Top = 8 + Width = 61 + Height = 13 + Caption = 'Username:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label3: TLabel + Left = 264 + Top = 8 + Width = 59 + Height = 13 + Caption = 'Password:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label4: TLabel + Left = 8 + Top = 52 + Width = 83 + Height = 13 + Caption = 'Command line:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object Label5: TLabel + Left = 8 + Top = 104 + Width = 75 + Height = 13 + Caption = 'Environment:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object edtDomain: TEdit + Left = 8 + Top = 24 + Width = 121 + Height = 21 + TabOrder = 0 + end + object edtUserName: TEdit + Left = 136 + Top = 24 + Width = 121 + Height = 21 + TabOrder = 1 + end + object edtPassword: TEdit + Left = 264 + Top = 24 + Width = 121 + Height = 21 + TabOrder = 2 + end + object edtCommandLine: TEdit + Left = 8 + Top = 68 + Width = 377 + Height = 21 + TabOrder = 3 + end + object btnCreateProcAsUser: TButton + Left = 8 + Top = 312 + Width = 129 + Height = 25 + Caption = 'Create Process As User' + Default = True + TabOrder = 4 + OnClick = btnCreateProcAsUserClick + end + object btnCreateProcAsUserEx: TButton + Left = 148 + Top = 312 + Width = 145 + Height = 25 + Caption = 'Create Process As User Ex' + TabOrder = 5 + OnClick = btnCreateProcAsUserExClick + end + object lbEnvironment: TListBox + Left = 8 + Top = 120 + Width = 193 + Height = 141 + ItemHeight = 13 + TabOrder = 6 + end + object edtEnvString: TEdit + Left = 216 + Top = 120 + Width = 165 + Height = 21 + TabOrder = 7 + end + object btnAddEnvString: TButton + Left = 216 + Top = 148 + Width = 75 + Height = 25 + Caption = 'Add' + TabOrder = 8 + OnClick = btnAddEnvStringClick + end + object btnRemoveEnvString: TButton + Left = 216 + Top = 176 + Width = 75 + Height = 25 + Caption = 'Remove' + TabOrder = 9 + OnClick = btnRemoveEnvStringClick + end + object btnClearEnvStrings: TButton + Left = 216 + Top = 204 + Width = 75 + Height = 25 + Caption = 'Clear' + TabOrder = 10 + OnClick = btnClearEnvStringsClick + end + object chkEnvAdditional: TCheckBox + Left = 216 + Top = 236 + Width = 97 + Height = 17 + Caption = 'Additional' + TabOrder = 11 + end + object chkEnvCurrentUser: TCheckBox + Left = 216 + Top = 256 + Width = 97 + Height = 17 + Caption = 'Current User' + TabOrder = 12 + end + object chkEnvLocalMachine: TCheckBox + Left = 216 + Top = 276 + Width = 97 + Height = 17 + Caption = 'Local Machine' + TabOrder = 13 + end +end diff --git a/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.pas b/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.pas new file mode 100644 index 0000000..1b84f54 --- /dev/null +++ b/official/1.100/examples/windows/asuser/CreateProcAsUserDemoMain.pas @@ -0,0 +1,93 @@ +unit CreateProcAsUserDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TForm1 = class(TForm) + edtDomain: TEdit; + Label1: TLabel; + edtUserName: TEdit; + Label2: TLabel; + edtPassword: TEdit; + Label3: TLabel; + edtCommandLine: TEdit; + Label4: TLabel; + btnCreateProcAsUser: TButton; + btnCreateProcAsUserEx: TButton; + lbEnvironment: TListBox; + Label5: TLabel; + edtEnvString: TEdit; + btnAddEnvString: TButton; + btnRemoveEnvString: TButton; + btnClearEnvStrings: TButton; + chkEnvAdditional: TCheckBox; + chkEnvCurrentUser: TCheckBox; + chkEnvLocalMachine: TCheckBox; + procedure btnAddEnvStringClick(Sender: TObject); + procedure btnClearEnvStringsClick(Sender: TObject); + procedure btnRemoveEnvStringClick(Sender: TObject); + procedure btnCreateProcAsUserClick(Sender: TObject); + procedure btnCreateProcAsUserExClick(Sender: TObject); + private + public + end; + +var + Form1: TForm1; + +implementation + +uses + JclMiscel, JclStrings, JclSysInfo; + +{$R *.dfm} + +procedure TForm1.btnAddEnvStringClick(Sender: TObject); +begin + lbEnvironment.Items.Add(edtEnvString.Text); +end; + +procedure TForm1.btnClearEnvStringsClick(Sender: TObject); +begin + lbEnvironment.Items.Clear; +end; + +procedure TForm1.btnRemoveEnvStringClick(Sender: TObject); +var + I: Integer; +begin + for I := lbEnvironment.Items.Count - 1 downto 0 do + if lbEnvironment.Selected[I] then + lbEnvironment.Items.Delete(I); +end; + +procedure TForm1.btnCreateProcAsUserClick(Sender: TObject); +begin + CreateProcAsUser(edtDomain.Text, edtUserName.Text, + edtPassWord.Text, edtCommandline.Text); +end; + +procedure TForm1.btnCreateProcAsUserExClick(Sender: TObject); +var + Env: PChar; + EnvOptions: TEnvironmentOptions; +begin + EnvOptions := []; + if chkEnvAdditional.Checked then + EnvOptions := EnvOptions + [eoAdditional]; + if chkEnvCurrentUser.Checked then + EnvOptions := EnvOptions + [eoCurrentUser]; + if chkEnvLocalMachine.Checked then + EnvOptions := EnvOptions + [eoLocalMachine]; + + Env := CreateEnvironmentBlock(EnvOptions, lbEnvironment.Items); + CreateProcAsUserEx(edtDomain.Text, edtUserName.Text, + edtPassWord.Text, edtCommandline.Text, Env); + DestroyEnvironmentBlock(Env); +end; + +end. diff --git a/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dof b/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dpr b/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dpr new file mode 100644 index 0000000..d78c9e5 --- /dev/null +++ b/official/1.100/examples/windows/asuser/CreateProcAsUserExample.dpr @@ -0,0 +1,17 @@ +program CreateProcAsUserExample; + + +{$I jcl.inc} + +uses + Forms, + CreateProcAsUserDemoMain in 'CreateProcAsUserDemoMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/asuser/CreateProcAsUserExample.res b/official/1.100/examples/windows/asuser/CreateProcAsUserExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/clr/ClrDemo.dof b/official/1.100/examples/windows/clr/ClrDemo.dof new file mode 100644 index 0000000..4a388e0 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemo.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\bin + diff --git a/official/1.100/examples/windows/clr/ClrDemo.dpr b/official/1.100/examples/windows/clr/ClrDemo.dpr new file mode 100644 index 0000000..8ec09f3 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemo.dpr @@ -0,0 +1,24 @@ +program ClrDemo; + +{$I jcl.inc} + +uses + Forms, + ClrDemoMain in 'ClrDemoMain.pas' {frmMain}, + ClrDemoAbstractFrame in 'ClrDemoAbstractFrame.pas' {frmAbstract: TFrame}, + ClrDemoMetaDataFrame in 'ClrDemoMetaDataFrame.pas' {frmMetadata: TFrame}, + ClrDemoStringsForm in 'ClrDemoStringsForm.pas' {frmStrings}, + ClrDemoGuidForm in 'ClrDemoGuidForm.pas' {frmGuid}, + ClrDemoBlobForm in 'ClrDemoBlobForm.pas' {frmBlobs}, + ClrDemoTableForm in 'ClrDemoTableForm.pas' {frmTable}, + ClrDemoUserStringsForm in 'ClrDemoUserStringsForm.pas' {frmUserStrings}, + ClrDemoCLRFrame in 'ClrDemoCLRFrame.pas' {frmCLR: TFrame}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/official/1.100/examples/windows/clr/ClrDemo.res b/official/1.100/examples/windows/clr/ClrDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..82939cc191c05fe6fd6dd859ecac1882ea6c6860 GIT binary patch literal 1128 zcmd^8Jxjw-6g|;E9g1dfa5IC0V}^o@P(>|t(1Mk&C4)*qBB(zg|0@-;_x*$p4i0WQ zI*8A6?@frM4o)s!dhWaT+)rNm03as3H_%*=mz6rc%A7!BQPc|Sq+J>@aXx&YJ6iWUqYJoE8k`}`7BJ>Pt=|^3V7Hy6?dD8?YgG z0$P8CO#lhu{W?x@h(6AUBMf-f^8H=NYX}g>k-iFfMFHkaj0x`}qJB%^T3tU!hvo=F zjHyp>POGmI#yYP@TjVi({gi$NVXRkIOiD-?qpqrb)k8es4ijX!MvvzWF4;N56>b^d s(wu}_B-kT5+(9-vR(^z(waZn&j!wK_G-a=Qc1<~F!k(E{w!-J|3)TO2LI3~& literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.dfm b/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.dfm new file mode 100644 index 0000000..8252c1c --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.dfm @@ -0,0 +1,7 @@ +object frmAbstract: TfrmAbstract + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 +end diff --git a/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.pas b/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.pas new file mode 100644 index 0000000..2c49099 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoAbstractFrame.pas @@ -0,0 +1,105 @@ +unit ClrDemoAbstractFrame; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, JclCLR; + +type + TfrmAbstract = class(TFrame) + public + procedure ShowInfo(const ACLR: TJclCLRHeaderEx); virtual; abstract; + + class procedure DumpBuf(const Ptr: Pointer; const Size: Integer; + const memDump: TMemo; const Base: DWORD = 0; + const AutoClear: Boolean = True); overload; + class procedure DumpBuf(const Blob: TJclCLRBlobRecord; const memDump: TMemo; + const AutoClear: Boolean = False); overload; + end; + +implementation + +{$R *.DFM} + +uses + JclStrings; + +{ TfrmAbstract } + +class procedure TfrmAbstract.DumpBuf(const Ptr: Pointer; const Size: Integer; + const memDump: TMemo; const Base: DWORD; const AutoClear: Boolean); +const + WIDE_LINE_WIDTH = 76; + THIN_LINE_WIDTH = 44; +var + I, ByteCount, LineWidth: Integer; + pch: PChar; + DumpStr: string; +begin + if AutoClear then memDump.Clear; + + ByteCount := 0; + pch := Ptr; + + with TCanvas.Create do + try + Handle := GetDC(memDump.Handle); + Font.Name := 'Fixedsys'; + Font.Size := 12; + if (TextWidth('?')*WIDE_LINE_WIDTH) < memDump.ClientWidth then + LineWidth := 16 + else if (TextWidth('?')*THIN_LINE_WIDTH) < memDump.ClientWidth then + LineWidth := 8 + else + LineWidth := 4; + finally + Free; + end; + + with memDump.Lines do + try + BeginUpdate; + + while ByteCount < Size do + begin + DumpStr := IntToHex(Base + DWord(ByteCount), 8) + ': '; + for I:=0 to LineWidth-1 do + begin + if ((Size - ByteCount) > LineWidth) or ((Size - ByteCount) > I) then + DumpStr := DumpStr + IntToHex(Integer(pch[ByteCount+I]), 2) + ' ' + else + DumpStr := DumpStr + ' '; + end; + + DumpStr := DumpStr + '; '; + + for I:=0 to LineWidth-1 do + begin + if ((Size - ByteCount) > LineWidth) or ((Size - ByteCount) > I) then + begin + if CharIsAlphaNum(Char(pch[ByteCount+I])) then + DumpStr := DumpStr + pch[ByteCount+I] + else + DumpStr := DumpStr + '.' + end + else + DumpStr := DumpStr + ' '; + end; + + Add(DumpStr); + Inc(ByteCount, LineWidth); + end; + finally + EndUpdate; + end; + memDump.Perform(WM_VSCROLL, SB_TOP, 0); +end; + +class procedure TfrmAbstract.DumpBuf(const Blob: TJclCLRBlobRecord; + const memDump: TMemo; const AutoClear: Boolean); +begin + TfrmAbstract.DumpBuf(Blob.Memory, Blob.Size, memDump, Blob.Offset, AutoClear); +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoBlobForm.dfm b/official/1.100/examples/windows/clr/ClrDemoBlobForm.dfm new file mode 100644 index 0000000..cd4bb39 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoBlobForm.dfm @@ -0,0 +1,71 @@ +object frmBlobs: TfrmBlobs + Left = 414 + Top = 406 + BorderStyle = bsDialog + Caption = 'Blob Stream' + ClientHeight = 273 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + PixelsPerInch = 96 + TextHeight = 13 + object btnOK: TBitBtn + Left = 159 + Top = 240 + Width = 75 + Height = 25 + TabOrder = 0 + Kind = bkOK + end + object lstBlobs: TListView + Left = 8 + Top = 8 + Width = 377 + Height = 105 + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Alignment = taCenter + Caption = 'Offset' + Width = 80 + end + item + Caption = 'Size' + Width = 64 + end> + GridLines = True + OwnerData = True + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnData = lstBlobsData + OnSelectItem = lstBlobsSelectItem + end + object memDump: TMemo + Left = 8 + Top = 120 + Width = 377 + Height = 113 + Color = clInactiveBorder + Font.Charset = GB2312_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Fixedsys' + Font.Style = [] + ImeName = #32043#20809#25340#38899#36755#20837#27861'2.2'#29256 + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 2 + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoBlobForm.pas b/official/1.100/examples/windows/clr/ClrDemoBlobForm.pas new file mode 100644 index 0000000..ef8bf69 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoBlobForm.pas @@ -0,0 +1,71 @@ +unit ClrDemoBlobForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + JclCLR, StdCtrls, Buttons, ComCtrls; + +type + TfrmBlobs = class(TForm) + btnOK: TBitBtn; + lstBlobs: TListView; + memDump: TMemo; + procedure lstBlobsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure lstBlobsData(Sender: TObject; Item: TListItem); + private + FStream: TJclCLRBlobStream; + procedure ShowBlobs(const AStream: TJclCLRBlobStream); + public + class procedure Execute(const AStream: TJclCLRBlobStream); + end; + +var + frmBlobs: TfrmBlobs; + +implementation + +uses ClrDemoAbstractFrame; + +{$R *.DFM} + +{ TfrmBlobs } + +class procedure TfrmBlobs.Execute(const AStream: TJclCLRBlobStream); +begin + with TfrmBlobs.Create(nil) do + try + ShowBlobs(AStream); + ShowModal; + finally + Free; + end; +end; + +procedure TfrmBlobs.ShowBlobs(const AStream: TJclCLRBlobStream); +begin + FStream := AStream; + lstBlobs.Items.Count := FStream.BlobCount; +end; + +procedure TfrmBlobs.lstBlobsSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); +begin + if Selected then + with TJclCLRBlobRecord(Item.Data) do + TfrmAbstract.DumpBuf(Memory, Size, memDump, + FStream.Offset + DWORD(Memory) - DWORD(FStream.Data)); +end; + +procedure TfrmBlobs.lstBlobsData(Sender: TObject; Item: TListItem); +begin + Item.Caption := IntToStr(Item.Index); + Item.Data := FStream.Blobs[Item.Index]; + + Item.SubItems.Add('$' + + IntToHex(FStream.Blobs[Item.Index].Offset, 8)); + Item.SubItems.Add(IntToStr(FStream.Blobs[Item.Index].Size)); +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoCLRFrame.dfm b/official/1.100/examples/windows/clr/ClrDemoCLRFrame.dfm new file mode 100644 index 0000000..99dd6f2 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoCLRFrame.dfm @@ -0,0 +1,184 @@ +inherited frmCLR: TfrmCLR + Width = 422 + Height = 325 + object PC: TPageControl + Left = 0 + Top = 89 + Width = 422 + Height = 236 + ActivePage = tsStrongNameSign + Align = alClient + TabOrder = 0 + object tsStrongNameSign: TTabSheet + Caption = 'Strong Name Signature' + object memStrongNameSign: TMemo + Left = 0 + Top = 0 + Width = 414 + Height = 208 + TabStop = False + Align = alClient + Color = clInactiveBorder + Font.Charset = GB2312_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Fixedsys' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + end + object tsResources: TTabSheet + Caption = 'Resources' + ImageIndex = 1 + object memResources: TMemo + Left = 0 + Top = 105 + Width = 414 + Height = 103 + TabStop = False + Align = alClient + Color = clInactiveBorder + Font.Charset = GB2312_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Fixedsys' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 0 + end + object lstResources: TListView + Left = 0 + Top = 0 + Width = 414 + Height = 105 + Align = alTop + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Alignment = taCenter + Caption = 'Offset' + Width = 80 + end + item + Alignment = taCenter + Caption = 'RVA' + Width = 80 + end + item + Caption = 'Size' + Width = 64 + end> + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnSelectItem = lstResourcesSelectItem + end + end + object tsVTableFixup: TTabSheet + Caption = 'VTable Fixups' + ImageIndex = 2 + object lstVTableFixups: TListView + Left = 0 + Top = 0 + Width = 414 + Height = 208 + Align = alClient + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Alignment = taCenter + Caption = 'Offset' + Width = 80 + end + item + Caption = 'Count' + Width = 40 + end + item + Caption = 'Flags' + Width = 200 + end> + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + end + end + end + object pnlTop: TPanel + Left = 0 + Top = 0 + Width = 422 + Height = 89 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object lblVer: TLabel + Left = 8 + Top = 16 + Width = 108 + Height = 13 + Caption = 'Required CLR Version:' + end + object lblEntryPointToken: TLabel + Left = 8 + Top = 56 + Width = 88 + Height = 13 + Caption = 'Entry Point Token:' + end + object edtVer: TEdit + Left = 120 + Top = 12 + Width = 121 + Height = 21 + Color = clInactiveBorder + ReadOnly = True + TabOrder = 0 + end + object boxFlags: TGroupBox + Left = 256 + Top = 0 + Width = 145 + Height = 81 + Caption = 'Image Runtime Flags' + TabOrder = 1 + object lstFlags: TCheckListBox + Left = 8 + Top = 16 + Width = 129 + Height = 57 + TabStop = False + Color = clInactiveBorder + ItemHeight = 13 + Items.Strings = ( + 'IL Only' + '32bit Required' + 'Strong Name Signed' + 'Track Debug Data') + TabOrder = 0 + end + end + object edtEntryPointToken: TEdit + Left = 120 + Top = 52 + Width = 121 + Height = 21 + Color = clInactiveBorder + ReadOnly = True + TabOrder = 2 + end + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoCLRFrame.pas b/official/1.100/examples/windows/clr/ClrDemoCLRFrame.pas new file mode 100644 index 0000000..38da0e0 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoCLRFrame.pas @@ -0,0 +1,183 @@ +unit ClrDemoCLRFrame; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ClrDemoAbstractFrame, StdCtrls, JclCLR, CheckLst, ExtCtrls, ComCtrls; + +type + TfrmCLR = class (TfrmAbstract) + boxFlags: TGroupBox; + edtEntryPointToken: TEdit; + edtVer: TEdit; + lblEntryPointToken: TLabel; + lblVer: TLabel; + lstFlags: TCheckListBox; + lstResources: TListView; + lstVTableFixups: TListView; + memResources: TMemo; + memStrongNameSign: TMemo; + PC: TPageControl; + pnlTop: TPanel; + tsResources: TTabSheet; + tsStrongNameSign: TTabSheet; + tsVTableFixup: TTabSheet; + procedure lstResourcesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); + private + FCLR: TJclClrHeaderEx; + public + procedure ShowInfo(const ACLR: TJclCLRHeaderEx); override; + end; + +var + frmCLR: TfrmCLR; + +implementation + +{$R *.DFM} + +uses + Math, TypInfo, JclMetadata; + +{ TfrmCLR } + +{ +*********************************** TfrmCLR ************************************ +} +procedure TfrmCLR.lstResourcesSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); +begin + if Selected then + with TJclCLRResourceRecord(Item.Data) do + DumpBuf(Memory, Size, memResources, RVA); +end; + +procedure TfrmCLR.ShowInfo(const ACLR: TJclCLRHeaderEx); + + procedure UpdateFlags; + var + AFlag: TJclClrImageFlag; + begin + for AFlag:=Low(TJclClrImageFlag) to High(TJclClrImageFlag) do + begin + lstFlags.Checked[Integer(AFlag)] := AFlag in ACLR.Flags; + lstFlags.ItemEnabled[Integer(AFlag)] := False; + end; + end; + + procedure UpdateEntryPointToken; + var + AMethod: TJclCLRTableMethodDefRow; + ATypeDef: TJclCLRTableTypeDefRow; + begin + if Assigned(ACLR.EntryPointToken) then + begin + if ACLR.EntryPointToken is TJclCLRTableMethodDefRow then + begin + AMethod := ACLR.EntryPointToken as TJclCLRTableMethodDefRow; + if AMethod.ParentToken is TJclCLRTableTypeDefRow then + begin + ATypeDef := AMethod.ParentToken as TJclCLRTableTypeDefRow; + edtEntryPointToken.Text := ATypeDef.Namespace + '.' + ATypeDef.Name + '.' + AMethod.Name; + end + else + edtEntryPointToken.Text := AMethod.Name; + end + else if ACLR.EntryPointToken is TJclCLRTableFileRow then + edtEntryPointToken.Text := 'External file' + else + edtEntryPointToken.Text := '$' + IntToHex(ACLR.Header.EntryPointToken, 8); + end + else + edtEntryPointToken.Text := '(none)'; + end; + + procedure UpdateStrongNameSign; + begin + if ACLR.HasStrongNameSignature then + with ACLR.StrongNameSignature, ACLR.Header.StrongNameSignature do + DumpBuf(Memory, Size, memStrongNameSign, + VirtualAddress-ACLR.Image.RvaToSection(VirtualAddress).PointerToRawData) + else + memStrongNameSign.Clear; + end; + + procedure UpdateResources; + var + I: Integer; + begin + with lstResources.Items do + try + BeginUpdate; + Clear; + + if ACLR.HasResources then + for I:=0 to ACLR.ResourceCount-1 do + with Add do + begin + Caption := IntToStr(I); + Data := ACLR.Resources[I]; + with ACLR.Resources[I] do + begin + SubItems.Add('$' + IntToHex(Offset, 8)); + SubItems.Add('$' + IntToHex(RVA, 8)); + SubItems.Add(IntToStr(Size)); + end; + end + else + memResources.Clear; + finally + EndUpdate; + end; + end; + + function FormatVTableKinds(const Kinds: TJclClrVTableKinds): string; + var + AKind: TJclClrVTableKind; + begin + Result := ''; + for AKind:=Low(TJclClrVTableKind) to High(TJclClrVTableKind) do + if AKind in Kinds then + Result := Result + GetEnumName(TypeInfo(TJclClrVTableKind), Integer(AKind)) + ' '; + end; + + procedure UpdateVTableFixups; + var + I: Integer; + begin + with lstVTableFixups.Items do + try + BeginUpdate; + Clear; + if ACLR.HasVTableFixup then + for I:=0 to ACLR.VTableFixupCount-1 do + with Add do + begin + Caption := IntToStr(I); + Data := ACLR.VTableFixups[I]; + with ACLR.VTableFixups[I] do + begin + SubItems.Add('$' + IntToHex(RVA, 8)); + SubItems.Add(IntToStr(Count)); + SubItems.Add(FormatVTableKinds(Kinds)); + end; + end; + finally + EndUpdate; + end; + end; + +begin + FCLR := ACLR; + + edtVer.Text := ACLR.VersionString; + UpdateEntryPointToken; + UpdateFlags; + UpdateStrongNameSign; + UpdateResources; + UpdateVTableFixups; +end; + +end. + diff --git a/official/1.100/examples/windows/clr/ClrDemoGuidForm.dfm b/official/1.100/examples/windows/clr/ClrDemoGuidForm.dfm new file mode 100644 index 0000000..252c632 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoGuidForm.dfm @@ -0,0 +1,48 @@ +object frmGuid: TfrmGuid + Left = 339 + Top = 225 + BorderStyle = bsDialog + Caption = 'Guid Stream' + ClientHeight = 273 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + PixelsPerInch = 96 + TextHeight = 13 + object btnOK: TBitBtn + Left = 159 + Top = 240 + Width = 75 + Height = 25 + TabOrder = 0 + Kind = bkOK + end + object lstGuids: TListView + Left = 8 + Top = 8 + Width = 377 + Height = 225 + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Caption = 'GUID' + Width = 320 + end> + GridLines = True + OwnerData = True + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnData = lstGuidsData + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoGuidForm.pas b/official/1.100/examples/windows/clr/ClrDemoGuidForm.pas new file mode 100644 index 0000000..0814a97 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoGuidForm.pas @@ -0,0 +1,53 @@ +unit ClrDemoGuidForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, StdCtrls, Buttons, JclCLR; + +type + TfrmGuid = class(TForm) + btnOK: TBitBtn; + lstGuids: TListView; + procedure lstGuidsData(Sender: TObject; Item: TListItem); + private + FStream: TJclCLRGuidStream; + procedure ShowGuids(const AStream: TJclCLRGuidStream); + public + class procedure Execute(const AStream: TJclCLRGuidStream); + end; + +implementation + +{$R *.DFM} + +uses + ComObj; + +{ TfrmGuid } + +class procedure TfrmGuid.Execute(const AStream: TJclCLRGuidStream); +begin + with TfrmGuid.Create(nil) do + try + ShowGuids(AStream); + ShowModal; + finally + Free; + end; +end; + +procedure TfrmGuid.ShowGuids(const AStream: TJclCLRGuidStream); +begin + FStream := AStream; + lstGuids.Items.Count := FStream.GuidCount; +end; + +procedure TfrmGuid.lstGuidsData(Sender: TObject; Item: TListItem); +begin + Item.Caption := IntToStr(Item.Index); + Item.SubItems.Add(GUIDToString(FStream.Guids[Item.Index])); +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoMain.dfm b/official/1.100/examples/windows/clr/ClrDemoMain.dfm new file mode 100644 index 0000000..4566ad1 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoMain.dfm @@ -0,0 +1,171 @@ +object frmMain: TfrmMain + Left = 274 + Top = 241 + Width = 696 + Height = 480 + Caption = 'Microsoft .Net Framework CLR Demo' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = mnuMain + OldCreateOrder = False + Position = poDesktopCenter + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object barStatus: TStatusBar + Left = 0 + Top = 415 + Width = 688 + Height = 19 + Panels = <> + end + object PC: TPageControl + Left = 0 + Top = 0 + Width = 688 + Height = 415 + ActivePage = tsCLR + Align = alClient + TabOrder = 1 + OnChange = PCChange + object tsCLR: TTabSheet + Caption = 'CLR' + inline frmCLR: TfrmCLR + Left = 0 + Top = 0 + Width = 680 + Height = 387 + Align = alClient + TabOrder = 0 + inherited PC: TPageControl + Width = 680 + Height = 298 + inherited tsStrongNameSign: TTabSheet + inherited memStrongNameSign: TMemo + Width = 672 + Height = 270 + end + end + end + inherited pnlTop: TPanel + Width = 680 + end + end + end + object tsMetadata: TTabSheet + Caption = 'Metadata' + ImageIndex = 1 + inline frmMetadata: TfrmMetadata + Left = 0 + Top = 0 + Width = 680 + Height = 387 + Align = alClient + TabOrder = 0 + inherited pnlVer: TPanel + Width = 680 + end + inherited lstStream: TListView + Width = 680 + Height = 355 + PopupMenu = popMetadataStream + OnDblClick = frmMetadatalstStreamDblClick + end + end + end + end + object lstActions: TActionList + Left = 24 + Top = 144 + object actFileExit: TAction + Category = 'File' + Caption = 'E&xit' + ShortCut = 32883 + OnExecute = actFileExitExecute + end + object actFileOpen: TAction + Category = 'File' + Caption = '&Open' + ShortCut = 16463 + OnExecute = actFileOpenExecute + end + object actHelpAbout: TAction + Category = 'Help' + Caption = '&About' + ShortCut = 112 + OnExecute = actHelpAboutExecute + end + object actViewStreamData: TAction + Category = 'View' + Caption = 'Stream &Data' + OnExecute = actViewStreamDataExecute + OnUpdate = actViewStreamDataUpdate + end + object actFileDump: TAction + Category = 'File' + Caption = 'Dump IL...' + ShortCut = 16452 + OnExecute = actFileDumpExecute + OnUpdate = actFileDumpUpdate + end + end + object mnuMain: TMainMenu + Left = 88 + Top = 144 + object mnuFile: TMenuItem + Caption = '&File' + object mnuFileOpen: TMenuItem + Action = actFileOpen + end + object mnuFileDump: TMenuItem + Action = actFileDump + end + object mnuFileLine0: TMenuItem + Caption = '-' + end + object mnuFileExit: TMenuItem + Action = actFileExit + end + end + object mnuView: TMenuItem + Caption = '&View' + object mnuViewStreamData: TMenuItem + Action = actViewStreamData + end + end + object mnuHelp: TMenuItem + Caption = '&Help' + object mnuFileAbout: TMenuItem + Action = actHelpAbout + end + end + end + object dlgOpen: TOpenDialog + Filter = 'Executable Files (*.exe;*.dll)|*.exe;*.dll|All Files (*.*)|*.*' + Title = 'Select a file to browse' + Left = 152 + Top = 144 + end + object popMetadataStream: TPopupMenu + Left = 236 + Top = 144 + object popViewStreamData: TMenuItem + Action = actViewStreamData + end + end + object dlgSave: TSaveDialog + DefaultExt = '.il' + Filter = + 'IL Source Files (*.il)|*.il|Text Files (*.txt)|*.txt|All Files (' + + '*.*)|*.*' + Options = [ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Title = 'Dump Metadata to IL Source File' + Left = 320 + Top = 144 + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoMain.pas b/official/1.100/examples/windows/clr/ClrDemoMain.pas new file mode 100644 index 0000000..a0687c3 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoMain.pas @@ -0,0 +1,195 @@ +unit ClrDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ActnList, Menus, ComCtrls, ClrDemoAbstractFrame, + JclPeImage, JclCLR, ClrDemoMetaDataFrame, ClrDemoCLRFrame; + +type + TfrmMain = class(TForm) + lstActions: TActionList; + actFileExit: TAction; + actFileOpen: TAction; + actHelpAbout: TAction; + mnuMain: TMainMenu; + mnuFile: TMenuItem; + mnuFileOpen: TMenuItem; + mnuFileLine0: TMenuItem; + mnuFileExit: TMenuItem; + mnuHelp: TMenuItem; + mnuFileAbout: TMenuItem; + dlgOpen: TOpenDialog; + barStatus: TStatusBar; + PC: TPageControl; + tsMetadata: TTabSheet; + frmMetadata: TfrmMetadata; + popMetadataStream: TPopupMenu; + actViewStreamData: TAction; + popViewStreamData: TMenuItem; + mnuView: TMenuItem; + mnuViewStreamData: TMenuItem; + tsCLR: TTabSheet; + frmCLR: TfrmCLR; + actFileDump: TAction; + dlgSave: TSaveDialog; + mnuFileDump: TMenuItem; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure actFileExitExecute(Sender: TObject); + procedure actHelpAboutExecute(Sender: TObject); + procedure actFileOpenExecute(Sender: TObject); + procedure PCChange(Sender: TObject); + procedure actViewStreamDataUpdate(Sender: TObject); + procedure actViewStreamDataExecute(Sender: TObject); + procedure frmMetadatalstStreamDblClick(Sender: TObject); + procedure actFileDumpExecute(Sender: TObject); + procedure actFileDumpUpdate(Sender: TObject); + private + m_Image: TJclPeImage; + m_CLR: TJclCLRHeaderEx; + + function GetActiveFrame: TfrmAbstract; + public + { Public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.DFM} + +uses + ShellApi, ClrDemoStringsForm, ClrDemoGuidForm, ClrDemoBlobForm, + ClrDemoTableForm, ClrDemoUserStringsForm; + +const + CRLF = #10#13; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + m_Image := nil; + m_CLR := nil; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + FreeAndNil(m_CLR); + FreeAndNil(m_Image); +end; + +function TfrmMain.GetActiveFrame: TfrmAbstract; +var + I: Integer; +begin + if Assigned(PC.ActivePage) then + with PC.ActivePage do + for I:=0 to ControlCount-1 do + if Controls[0].InheritsFrom(TfrmAbstract) then + begin + Result := TfrmAbstract(Controls[0]); + Exit; + end; + + raise Exception.Create('No frame was active!'); +end; + +procedure TfrmMain.actFileExitExecute(Sender: TObject); +begin + Close; +end; + +procedure TfrmMain.actHelpAboutExecute(Sender: TObject); +begin + ShellAbout(Handle, PChar(Caption), + PChar('JEDI Code Library (JCL)' + CRLF + 'http://delphi-jedi.org/'), + Application.Icon.Handle); +end; + +procedure TfrmMain.actFileOpenExecute(Sender: TObject); +var + Img: TJclPeImage; +begin + if dlgOpen.Execute then + begin + Img := TJclPeImage.Create; + Img.FileName := dlgOpen.FileName; + + if Img.IsCLR then + begin + FreeAndNil(m_Image); + m_Image := Img; + + FreeAndNil(m_CLR); + m_CLR := TJclCLRHeaderEx.Create(m_Image); + GetActiveFrame.ShowInfo(m_CLR); + end + else + begin + FreeAndNil(Img); + MessageDlg(Format('The file %s is not a CLR file', [dlgOpen.FileName]), mtWarning, [mbOK], 0); + end; + end; +end; + +procedure TfrmMain.PCChange(Sender: TObject); +begin + if Assigned(m_CLR) then + GetActiveFrame.ShowInfo(m_CLR); +end; + +procedure TfrmMain.actViewStreamDataUpdate(Sender: TObject); +begin + with frmMetadata.lstStream do + TAction(Sender).Enabled := Assigned(Selected) and + ((TObject(Selected.Data).ClassType = TJclCLRStringsStream) or + (TObject(Selected.Data).ClassType = TJclCLRGuidStream) or + (TObject(Selected.Data).ClassType = TJclCLRUserStringStream) or + (TObject(Selected.Data).ClassType = TJclCLRBlobStream) or + (TObject(Selected.Data).ClassType = TJclCLRTableStream)); +end; + +procedure TfrmMain.actViewStreamDataExecute(Sender: TObject); +begin + with frmMetadata.lstStream do + if TObject(Selected.Data).ClassType = TJclCLRStringsStream then + TfrmStrings.Execute(Selected.Data) + else if TObject(Selected.Data).ClassType = TJclCLRGuidStream then + TfrmGuid.Execute(Selected.Data) + else if TObject(Selected.Data).ClassType = TJclCLRUserStringStream then + TfrmUserStrings.Execute(Selected.Data) + else if TObject(Selected.Data).ClassType = TJclCLRBlobStream then + TfrmBlobs.Execute(Selected.Data) + else if TObject(Selected.Data).ClassType = TJclCLRTableStream then + TfrmTable.Execute(Selected.Data); +end; + +procedure TfrmMain.frmMetadatalstStreamDblClick(Sender: TObject); +begin + if actViewStreamData.Enabled then + actViewStreamDataExecute(Sender); +end; + +procedure TfrmMain.actFileDumpExecute(Sender: TObject); +begin + dlgSave.InitialDir := ExtractFilePath(m_Image.FileName); + dlgSave.FileName := ExtractFileName(ChangeFileExt(m_Image.FileName, '.il')); + if dlgSave.Execute then + with TStringList.Create do + try + Text := m_CLR.DumpIL; + SaveToFile(dlgSave.FileName); + finally + Free; + end; +end; + +procedure TfrmMain.actFileDumpUpdate(Sender: TObject); +begin + TAction(Sender).Enabled := Assigned(m_CLR); +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.dfm b/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.dfm new file mode 100644 index 0000000..da945dc --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.dfm @@ -0,0 +1,70 @@ +inherited frmMetadata: TfrmMetadata + Width = 374 + Height = 276 + object pnlVer: TPanel + Left = 0 + Top = 0 + Width = 374 + Height = 32 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object lblVer: TLabel + Left = 8 + Top = 8 + Width = 38 + Height = 13 + Caption = 'Version:' + end + object lblVerStr: TLabel + Left = 160 + Top = 8 + Width = 68 + Height = 13 + Caption = 'Version String:' + end + object edtVer: TEdit + Left = 56 + Top = 4 + Width = 89 + Height = 21 + Color = clInactiveBorder + ReadOnly = True + TabOrder = 0 + end + object edtVerStr: TEdit + Left = 240 + Top = 4 + Width = 89 + Height = 21 + Color = clInactiveBorder + ReadOnly = True + TabOrder = 1 + end + end + object lstStream: TListView + Left = 0 + Top = 32 + Width = 374 + Height = 244 + Align = alClient + Columns = < + item + AutoSize = True + Caption = 'Name' + end + item + AutoSize = True + Caption = 'Offset' + end + item + AutoSize = True + Caption = 'Size' + end> + GridLines = True + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.pas b/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.pas new file mode 100644 index 0000000..e1e4264 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoMetaDataFrame.pas @@ -0,0 +1,56 @@ +unit ClrDemoMetaDataFrame; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ClrDemoAbstractFrame, JclCLR, StdCtrls, ComCtrls, ExtCtrls, Menus; + +type + TfrmMetadata = class(TfrmAbstract) + pnlVer: TPanel; + lblVer: TLabel; + edtVer: TEdit; + edtVerStr: TEdit; + lblVerStr: TLabel; + lstStream: TListView; + private + { Private declarations } + public + procedure ShowInfo(const ACLR: TJclCLRHeaderEx); override; + end; + +var + frmMetadata: TfrmMetadata; + +implementation + +{$R *.DFM} + +{ TfrmMetadata } + +procedure TfrmMetadata.ShowInfo(const ACLR: TJclCLRHeaderEx); +var + I: Integer; +begin + with ACLR.Metadata do + begin + edtVer.Text := Version; + edtVerStr.Text := VersionString; + + with lstStream.Items do + begin + Clear; + for I:=0 to StreamCount-1 do + with Add do + begin + Caption := Streams[I].Name; + Data := Streams[I]; + SubItems.Add('$' + IntToHex(Streams[I].Offset, 8)); + SubItems.Add(IntToStr(Streams[I].Size)); + end; + end; + end; +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoStringsForm.dfm b/official/1.100/examples/windows/clr/ClrDemoStringsForm.dfm new file mode 100644 index 0000000..6803682 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoStringsForm.dfm @@ -0,0 +1,52 @@ +object frmStrings: TfrmStrings + Left = 291 + Top = 205 + BorderStyle = bsDialog + Caption = 'Strings Stream' + ClientHeight = 273 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + PixelsPerInch = 96 + TextHeight = 13 + object lstStrings: TListView + Left = 8 + Top = 8 + Width = 377 + Height = 225 + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Caption = 'Offset' + Width = 64 + end + item + Caption = 'String' + Width = 315 + end> + GridLines = True + OwnerData = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnData = lstStringsData + end + object btnOK: TBitBtn + Left = 158 + Top = 240 + Width = 75 + Height = 25 + TabOrder = 1 + Kind = bkOK + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoStringsForm.pas b/official/1.100/examples/windows/clr/ClrDemoStringsForm.pas new file mode 100644 index 0000000..a9364bf --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoStringsForm.pas @@ -0,0 +1,54 @@ +unit ClrDemoStringsForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ComCtrls, JclCLR; + +type + TfrmStrings = class(TForm) + lstStrings: TListView; + btnOK: TBitBtn; + procedure lstStringsData(Sender: TObject; Item: TListItem); + private + FStream: TJclCLRStringsStream; + procedure ShowStrings(const AStream: TJclCLRStringsStream); + public + class procedure Execute(const AStream: TJclCLRStringsStream); + end; + +implementation + +{$R *.DFM} + +uses + JclUnicode; + +{ TfrmStrings } + +class procedure TfrmStrings.Execute(const AStream: TJclCLRStringsStream); +begin + with TfrmStrings.Create(nil) do + try + ShowStrings(AStream); + ShowModal; + finally + Free; + end; +end; + +procedure TfrmStrings.ShowStrings(const AStream: TJclCLRStringsStream); +begin + FStream := AStream; + lstStrings.Items.Count := FStream.StringCount; +end; + +procedure TfrmStrings.lstStringsData(Sender: TObject; Item: TListItem); +begin + Item.Caption := IntToStr(Item.Index); + Item.SubItems.Add(IntToHex(FStream.Offsets[Item.Index], 8)); + Item.SubItems.Add(FStream.Strings[Item.Index]); +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoTableForm.dfm b/official/1.100/examples/windows/clr/ClrDemoTableForm.dfm new file mode 100644 index 0000000..1106400 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoTableForm.dfm @@ -0,0 +1,102 @@ +object frmTable: TfrmTable + Left = 384 + Top = 245 + BorderStyle = bsDialog + Caption = 'Table Stream' + ClientHeight = 453 + ClientWidth = 632 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + PixelsPerInch = 96 + TextHeight = 13 + object lblVer: TLabel + Left = 8 + Top = 8 + Width = 119 + Height = 13 + Caption = 'Table Schemata Version:' + end + object edtVer: TEdit + Left = 136 + Top = 4 + Width = 57 + Height = 21 + Color = clInactiveBorder + ReadOnly = True + TabOrder = 0 + end + object btnOK: TBitBtn + Left = 278 + Top = 424 + Width = 75 + Height = 25 + TabOrder = 1 + Kind = bkOK + end + object lstTables: TListView + Left = 8 + Top = 32 + Width = 617 + Height = 193 + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Alignment = taCenter + Caption = 'Rows' + Width = 40 + end + item + Alignment = taCenter + Caption = 'Offset' + Width = 76 + end + item + Caption = 'Size' + Width = 40 + end + item + Caption = 'Type' + Width = 200 + end> + GridLines = True + ReadOnly = True + RowSelect = True + TabOrder = 2 + ViewStyle = vsReport + OnSelectItem = lstTablesSelectItem + end + object memDump: TMemo + Left = 8 + Top = 232 + Width = 617 + Height = 185 + Color = clInactiveBorder + Font.Charset = GB2312_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Fixedsys' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 3 + end + object btnDumpIL: TButton + Left = 200 + Top = 4 + Width = 75 + Height = 25 + Caption = 'Dump IL' + TabOrder = 4 + OnClick = btnDumpILClick + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoTableForm.pas b/official/1.100/examples/windows/clr/ClrDemoTableForm.pas new file mode 100644 index 0000000..65f384f --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoTableForm.pas @@ -0,0 +1,598 @@ +unit ClrDemoTableForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, ComCtrls, JclClr, JclMetadata; + +type + TDumpLineKind = (lkWide, lkThin, lkEmpty); + + TfrmTable = class(TForm) + lblVer: TLabel; + edtVer: TEdit; + btnOK: TBitBtn; + lstTables: TListView; + memDump: TMemo; + btnDumpIL: TButton; + procedure lstTablesSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure btnDumpILClick(Sender: TObject); + private + FStream: TJclClrTableStream; + + procedure Dump(const Msg: string); overload; + procedure Dump(const FmtMsg: string; const Args: array of const); overload; + procedure Dump(const Msg: string; const Blob: TJclClrBlobRecord); overload; + procedure Dump(const LineKind: TDumpLineKind); overload; + procedure ShowTables(const AStream: TJclClrTableStream); + procedure DumpTable(const ATable: TJclClrTableAssembly); overload; + procedure DumpTable(const ATable: TJclClrTableAssemblyRef); overload; + procedure DumpTable(const ATable: TJclClrTableAssemblyOS); overload; + procedure DumpTable(const ATable: TJclClrTableAssemblyProcessor); overload; + procedure DumpTable(const ATable: TJclClrTableModule); overload; + procedure DumpTable(const ATable: TJclClrTableModuleRef); overload; + procedure DumpTable(const ATable: TJclClrTableFieldDef); overload; + procedure DumpTable(const ATable: TJclClrTableMemberRef); overload; + procedure DumpTable(const ATable: TJclClrTableCustomAttribute); overload; + procedure DumpTable(const ATable: TJclClrTableMethodDef); overload; + procedure DumpTable(const ATable: TJclClrTableTypeDef); overload; + procedure DumpTable(const ATable: TJclClrTableTypeRef); overload; + procedure DumpTable(const ATable: TJclClrTablePropertyDef); overload; + procedure DumpTable(const ATable: TJclClrTableManifestResource); overload; + procedure DumpTable(const ATable: TJclClrTableFile); overload; + procedure DumpTable(const ATable: TJclClrTableParamDef); overload; + procedure DumpTable(const ATable: TJclClrTableExportedType); overload; + public + class procedure Execute(const AStream: TJclClrTableStream); + end; + +implementation + +{$R *.DFM} + +{.$DEFINE USE_JWA} + +uses + ComObj, TypInfo, ClrDemoAbstractFrame, +{$IFDEF USE_JWA} + JwaWinCrypt, JwaWinNT, +{$ENDIF} + JclStrings, JclSysUtils, ClrDemoMain; + +{ TfrmTable } + +class procedure TfrmTable.Execute(const AStream: TJclClrTableStream); +begin + with TfrmTable.Create(nil) do + try + ShowTables(AStream); + ShowModal; + finally + Free; + end; +end; + +procedure TfrmTable.Dump(const Msg: string); +begin + memDump.Lines.Add(Msg); +end; + +procedure TfrmTable.Dump(const FmtMsg: string; const Args: array of const); +begin + Dump(Format(FmtMsg, Args)); +end; + +procedure TfrmTable.Dump(const Msg: string; const Blob: TJclClrBlobRecord); +begin + Dump(Msg); + TfrmAbstract.DumpBuf(Blob, memDump); +end; + +procedure TfrmTable.Dump(const LineKind: TDumpLineKind); +begin + case LineKind of + lkWide: Dump('========================================'); + lkThin: Dump('----------------------------------------'); + lkEmpty: Dump(''); + end; +end; + +procedure TfrmTable.ShowTables(const AStream: TJclClrTableStream); +var + AKind: TJclClrTableKind; +begin + FStream := AStream; + edtVer.Text := AStream.VersionString; + with lstTables.Items do + begin + BeginUpdate; + try + Clear; + for AKind:=Low(TJclClrTableKind) to High(TJclClrTableKind) do + if Assigned(AStream.Tables[AKind]) then + with AStream.Tables[AKind], Add do + begin + Caption := IntToStr(Count); + Data := AStream.Tables[AKind]; + SubItems.Add(IntToStr(RowCount)); + SubItems.Add('$' + IntToHex(Offset, 8)); + SubItems.Add(IntToStr(Size)); + SubItems.Add(Copy(AStream.Tables[AKind].ClassName, StrLen('TJclClrTable')+1, MaxWord)); + end; + finally + EndUpdate; + end; + end; +end; + +procedure TfrmTable.lstTablesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); +var + ATable: TJclClrTable; +begin + if Selected then + begin + ATable := TJclClrTable(Item.Data); + memDump.Clear; + + if ATable.ClassType = TJclClrTableAssembly then + DumpTable(TJclClrTableAssembly(ATable)) + else if ATable.ClassType = TJclClrTableAssemblyRef then + DumpTable(TJclClrTableAssemblyRef(ATable)) + else if ATable.ClassType = TJclClrTableAssemblyOS then + DumpTable(TJclClrTableAssemblyOS(ATable)) + else if ATable.ClassType = TJclClrTableAssemblyProcessor then + DumpTable(TJclClrTableAssemblyProcessor(ATable)) + else if ATable.ClassType = TJclClrTableModule then + DumpTable(TJclClrTableModule(ATable)) + else if ATable.ClassType = TJclClrTableModuleRef then + DumpTable(TJclClrTableModuleRef(ATable)) + else if ATable.ClassType = TJclClrTableTypeDef then + DumpTable(TJclClrTableTypeDef(ATable)) + else if ATable.ClassType = TJclClrTableTypeRef then + DumpTable(TJclClrTableTypeRef(ATable)) + else if ATable.ClassType = TJclClrTableMethodDef then + DumpTable(TJclClrTableMethodDef(ATable)) + else if ATable.ClassType = TJclClrTableFieldDef then + DumpTable(TJclClrTableFieldDef(ATable)) + else if ATable.ClassType = TJclClrTableMemberRef then + DumpTable(TJclClrTableMemberRef(ATable)) + else if ATable.ClassType = TJclClrTableCustomAttribute then + DumpTable(TJclClrTableCustomAttribute(ATable)) + else if ATable.ClassType = TJclClrTableParamDef then + DumpTable(TJclClrTableParamDef(ATable)) + else if ATable.ClassType = TJclClrTablePropertyDef then + DumpTable(TJclClrTablePropertyDef(ATable)) + else if ATable.ClassType = TJclClrTableFile then + DumpTable(TJclClrTableFile(ATable)) + else if ATable.ClassType = TJclClrTableManifestResource then + DumpTable(TJclClrTableManifestResource(ATable)) + else if ATable.ClassType = TJclClrTableExportedType then + DumpTable(TJclClrTableExportedType(ATable)); + + memDump.Perform(WM_VSCROLL, SB_TOP, 0); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableAssembly); + function GetHashAlgName(const HashAlgId: DWORD): string; + begin + {$IFDEF USE_JWA} + case HashAlgId of + CALG_MD2: Result := 'MD2'; + CALG_MD4: Result := 'MD4'; + CALG_MD5: Result := 'MD5'; + CALG_SHA1: Result := 'SHA1'; + CALG_MAC: Result := 'MAC'; + else + Result := IntToHex(HashAlgId, 8); + end; + {$ELSE} + Result := IntToHex(HashAlgId, 8); + {$ENDIF} + end; +var + AFlag: TJclClrAssemblyFlag; + FlagMsg: string; +begin + Assert(ATable.RowCount = 1); + with ATable[0] do + begin + Dump('Name: ' + Name); + Dump('Version: ' + Version); + FlagMsg := 'Flag: '; + for AFlag := Low(TJclClrAssemblyFlag) to High(TJclClrAssemblyFlag) do + if AFlag in Flags then + FlagMsg := FlagMsg + + GetEnumName(TypeInfo(TJclClrAssemblyFlag), Integer(AFlag)) + ' '; + Dump(FlagMsg); + if CultureOffset <> 0 then + Dump('Culture: ' + Culture); + Dump('Hash Algorithm: ' + GetHashAlgName(HashAlgId)); + if Assigned(PublicKey) then + Dump('Public Key: ', PublicKey); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableAssemblyRef); +var + I: Integer; + AFlag: TJclClrAssemblyFlag; + FlagMsg: string; + Assembly: TJclClrTableAssemblyRefRow; +begin + for I:=0 to ATable.RowCount-1 do + begin + Assembly := ATable[I]; + Dump('Name: ' + Assembly.Name); + Dump('Version: ' + Assembly.Version); + FlagMsg := 'Flag: '; + for AFlag := Low(TJclClrAssemblyFlag) to High(TJclClrAssemblyFlag) do + if AFlag in Assembly.Flags then + FlagMsg := FlagMsg + + GetEnumName(TypeInfo(TJclClrAssemblyFlag), Integer(AFlag)) + ' '; + Dump(FlagMsg); + if Assembly.CultureOffset <> 0 then + Dump('Culture: ' + Assembly.Culture); + if Assigned(Assembly.PublicKeyOrToken) then + Dump('Public Key or Token: ', Assembly.PublicKeyOrToken); + if Assigned(Assembly.HashValue) then + Dump('Hash Value: ', Assembly.HashValue); + Dump(lkWide); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableAssemblyOS); + function GetOSName(const PlatformID: DWORD): string; + begin + case PlatformID of + VER_PLATFORM_WIN32s: Result := 'Win32s'; + VER_PLATFORM_WIN32_WINDOWS: Result := 'Windows'; + VER_PLATFORM_WIN32_NT: Result := 'WinNT'; + else + Result := IntToHex(PlatformID, 8); + end; + end; +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + begin + Dump('OS : ' + GetOSName(ATable[I].PlatformID)); + Dump('Version: ' + ATable[I].Version); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableAssemblyProcessor); + function GetProcessName(const Processor: DWORD): string; + begin + {$IFDEF USE_JWA} + case Processor of + PROCESSOR_INTEL_386: Result := 'Intel 386'; + PROCESSOR_INTEL_486: Result := 'Intel 486'; + PROCESSOR_INTEL_PENTIUM: Result := 'Intel Pentium'; + PROCESSOR_INTEL_IA64: Result := 'Intel IA64'; + PROCESSOR_MIPS_R4000: Result := 'MIPS R4000'; + PROCESSOR_ALPHA_21064: Result := 'Alpha 21064'; + PROCESSOR_PPC_601: Result := 'Power PC 601'; + PROCESSOR_PPC_603: Result := 'Power PC 603'; + PROCESSOR_PPC_604: Result := 'Power PC 604'; + PROCESSOR_PPC_620: Result := 'Power PC 620'; + PROCESSOR_OPTIL: Result := 'MS IL'; + else + Result := IntToStr(Processor) + ' [' + IntToHex(Processor, 8) + ']'; + end; + {$ELSE} + Result := IntToStr(Processor) + ' [' + IntToHex(Processor, 8) + ']'; + {$ENDIF} + end; +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + begin + Dump('Processor : ' + GetProcessName(ATable[I].Processor)); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableModule); +begin + Assert(ATable.RowCount = 1); + with ATable[0] do + begin + Dump('Name : %s', [Name]); + Dump('Mvid : %s', [GUIDToString(Mvid)]); + if HasEncId then + Dump('EncId : %s', [GUIDToString(EncId)]); + if HasEncBaseId then + Dump('EncBaseId: %s', [GUIDToString(EncBaseId)]); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableModuleRef); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('Name : ' + ATable[I].Name); +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableTypeDef); +const + ClassSemanticsNames: array[TJclClrClassSemantics] of string = + ('.class', 'interface'); + TypeVisibilityNames: array[TJclClrTypeVisibility] of string = + ('private', 'public', 'nested public', 'nested private', 'nested family', + 'nested assembly', 'nested famandassem', 'nested famorassem'); + AbstractNames: array[Boolean] of string = ('', 'abstract '); + ClassLayoutNames: array[TJclClrClassLayout] of string = + ('auto', 'sequential', 'explicit'); + StringFormattingNames: array[TJclClrStringFormatting] of string = + ('ansi', 'unicode', 'autochar'); + ImportNames: array[Boolean] of string = ('', 'import '); + SerializableNames: array[Boolean] of string = ('', 'serializable'); + SealedNames: array[Boolean] of string = ('', 'sealed '); + SpecialNameNames: array[Boolean] of string = ('', 'specialname '); + BeforeFieldInitNames: array[Boolean] of string = ('', 'beforefieldinit '); + RTSpecialNameNames: array[Boolean] of string = ('', 'rtspecialname '); + HasSecurityNames: array[Boolean] of string = ('', 'HasSecurity '); +var + I, J: Integer; +begin + for I:=0 to ATable.RowCount-1 do + with ATable.Rows[I] do + begin + Dump('%s %s %s%s %s %s%s%s%s%s%s%s%s', + [ClassSemanticsNames[ClassSemantics], + TypeVisibilityNames[Visibility], + AbstractNames[taAbstract in Attributes], + ClassLayoutNames[ClassLayout], + StringFormattingNames[StringFormatting], + ImportNames[taImport in Attributes], + SerializableNames[taSerializable in Attributes], + SealedNames[taSealed in Attributes], + SpecialNameNames[taSpecialName in Attributes], + BeforeFieldInitNames[taBeforeFieldInit in Attributes], + RTSpecialNameNames[taRTSpecialName in Attributes], + HasSecurityNames[taHasSecurity in Attributes], + FullName]); + + if HasField then + for J:=0 to FieldCount-1 do + Dump(' .field %s', [Fields[J].Name]); + + if HasMethod then + for J:=0 to MethodCount-1 do + Dump(' .method %s', [Methods[J].Name]); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableTypeRef); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('%s.%s', [ATable.Rows[I].Namespace, ATable.Rows[I].Name]) +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableMethodDef); +var + I, J: Integer; + AttrStr, ParamStr: string; +begin + for I:=0 to ATable.RowCount-1 do + with ATable.Rows[I] do + begin + if HasParam then + begin + ParamStr := ''; + for J:=0 to ParamCount-1 do + begin + if ParamStr <> '' then + ParamStr := ParamStr + ', '; + if Params[J].Flags <> [] then + begin + AttrStr := ''; + if pkIn in Params[J].Flags then + AttrStr := AttrStr + 'In'; + if pkOut in Params[J].Flags then + begin + if AttrStr <> '' then + AttrStr := AttrStr + ', '; + AttrStr := AttrStr + 'Out'; + end; + if pkOptional in Params[J].Flags then + begin + if AttrStr <> '' then + AttrStr := AttrStr + ', '; + AttrStr := AttrStr + 'Opt'; + end; + if pkHasDefault in Params[J].Flags then + begin + if AttrStr <> '' then + AttrStr := AttrStr + ', '; + AttrStr := AttrStr + 'Default'; + end; + if pkHasFieldMarshal in Params[J].Flags then + begin + if AttrStr <> '' then + AttrStr := AttrStr + ', '; + AttrStr := AttrStr + 'Marshal'; + end; + ParamStr := ParamStr + '[' + AttrStr + '] '; + end; + ParamStr := ParamStr + Params[J].Name; + end; + end; + if Assigned(MethodBody) then + begin + Dump('%s.%s::%s(%s) @ %p:%d', [ParentToken.Namespace, ParentToken.Name, Name, ParamStr, Pointer(RVA), MethodBody.Size]); + TfrmAbstract.DumpBuf(MethodBody.Code, MethodBody.Size, memDump, DWORD(MethodBody.Code), False); + end + else + begin + Dump('%s.%s::%s(%s)', [ParentToken.Namespace, ParentToken.Name, Name, ParamStr]); + end; + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableFieldDef); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('%s', [ATable.Rows[I].Name]) +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableMemberRef); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('%s', [ATable.Rows[I].Name]) +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableCustomAttribute); + function GetParent(const Attr: TJclClrTableCustomAttributeRow): string; + var + ARow: TJclClrTableRow; + begin + ARow := Attr.Parent; + if ARow is TJclClrTableAssemblyRow then + with ARow as TJclClrTableAssemblyRow do + Result := Name + else if ARow is TJclClrTableTypeDefRow then + with ARow as TJclClrTableTypeDefRow do + Result := Namespace + '.' + Name + else if ARow is TJclClrTableTypeRefRow then + with ARow as TJclClrTableTypeRefRow do + Result := Namespace + '.' + Name + else if ARow is TJclClrTableMethodDefRow then + with ARow as TJclClrTableMethodDefRow do + Result := Name + else if ARow is TJclClrTableParamDefRow then + with ARow as TJclClrTableParamDefRow do + Result := Method.ParentToken.Namespace + '.' + Method.ParentToken.Name + '::' + + Method.Name + '(..., ' + Name + ', ...)' + else + Result := 'Unknown Parent'; + + Result := Result + ' <' + Copy(ARow.ClassName, Length('TJclClrTable')+1, + Length(ARow.ClassName)-Length('TJclClrTable')-Length('Row')) + + '> [' + IntToHex(Attr.ParentIdx, 8) + ']'; + end; + function GetMethod(const Attr: TJclClrTableCustomAttributeRow): string; + function GetParentClassName(const ParentClass: TJclClrTableRow): string; + begin + if ParentClass is TJclClrTableTypeRefRow then + with ParentClass as TJclClrTableTypeRefRow do + Result := Namespace + '.' + Name + else if ParentClass is TJclClrTableModuleRefRow then + with ParentClass as TJclClrTableModuleRefRow do + Result := Name + else if ParentClass is TJclClrTableMethodDefRow then + with ParentClass as TJclClrTableMethodDefRow do + Result := Name + else if ParentClass is TJclClrTableTypeSpecRow then + Result := '' + else if ParentClass is TJclClrTableTypeDefRow then + with ParentClass as TJclClrTableTypeDefRow do + Result := Namespace + '.' + Name + else + Result := 'Unknown Class - ' + ParentClass.ClassName; + end; + var + AMethod: TJclClrTableRow; + begin + AMethod := Attr.Method; + if AMethod is TJclClrTableMethodDefRow then + with AMethod as TJclClrTableMethodDefRow do + Result := ParentToken.Namespace + '.' + ParentToken.Name + ' :: ' + Name + else if AMethod is TJclClrTableMemberRefRow then + with AMethod as TJclClrTableMemberRefRow do + Result := GetParentClassName(ParentClass) + '::' + Name + else + Result := 'Unknown method type - ' + IntToHex(Attr.ParentIdx, 8); + + Result := Result + ' <' + Copy(AMethod.ClassName, Length('TJclClrTable')+1, + Length(AMethod.ClassName)-Length('TJclClrTable')-Length('Row')) + + '> [' + IntToHex(Attr.TypeIdx, 8) + ']'; + end; +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + begin + Dump('Parent: ' + GetParent(ATable[I])); + Dump('Method: ' + GetMethod(ATable[I])); + Dump('Value: ', ATable[I].Value); + Dump(lkWide); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableParamDef); +var + I: Integer; + Attr: string; +begin + for I:=0 to ATable.RowCount-1 do + begin + Attr := ''; + if pkIn in ATable.Rows[I].Flags then + Attr := Attr + 'In '; + if pkOut in ATable.Rows[I].Flags then + Attr := Attr + 'Out '; + if pkOptional in ATable.Rows[I].Flags then + Attr := Attr + 'Opt '; + if pkHasDefault in ATable.Rows[I].Flags then + Attr := Attr + 'Default '; + if pkHasFieldMarshal in ATable.Rows[I].Flags then + Attr := Attr + 'Marshal '; + + Dump('%s %s', [ATable.Rows[I].Name, Attr]); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTablePropertyDef); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('%s', [ATable.Rows[I].Name]) +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableManifestResource); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump('%s', [ATable.Rows[I].Name]) +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableFile); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + begin + Dump('File Name: ' + ATable[I].Name); + Dump('Contains Metadata: ' + BooleanToStr(ATable[I].ContainsMetadata)); + Dump('Hash Value: ', ATable[I].HashValue); + end; +end; + +procedure TfrmTable.DumpTable(const ATable: TJclClrTableExportedType); +var + I: Integer; +begin + for I:=0 to ATable.RowCount-1 do + Dump(ATable[I].TypeNamespace + '.' + ATable[I].TypeName); +end; + +procedure TfrmTable.btnDumpILClick(Sender: TObject); +begin + frmMain.actFileDump.Execute; +end; + +end. diff --git a/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.dfm b/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.dfm new file mode 100644 index 0000000..9630d9b --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.dfm @@ -0,0 +1,52 @@ +object frmUserStrings: TfrmUserStrings + Left = 299 + Top = 296 + BorderStyle = bsDialog + Caption = 'User String Stream' + ClientHeight = 273 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = True + Position = poMainFormCenter + PixelsPerInch = 96 + TextHeight = 13 + object lstStrings: TListView + Left = 8 + Top = 8 + Width = 377 + Height = 225 + Columns = < + item + Caption = 'Index' + Width = 40 + end + item + Caption = 'Offset' + Width = 64 + end + item + Caption = 'String' + Width = 315 + end> + GridLines = True + OwnerData = True + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnData = lstStringsData + end + object btnOK: TBitBtn + Left = 158 + Top = 240 + Width = 75 + Height = 25 + TabOrder = 1 + Kind = bkOK + end +end diff --git a/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.pas b/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.pas new file mode 100644 index 0000000..8bde438 --- /dev/null +++ b/official/1.100/examples/windows/clr/ClrDemoUserStringsForm.pas @@ -0,0 +1,54 @@ +unit ClrDemoUserStringsForm; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ClrDemoStringsForm, StdCtrls, Buttons, ComCtrls, JclCLR; + +type + TfrmUserStrings = class(TForm) + lstStrings: TListView; + btnOK: TBitBtn; + procedure lstStringsData(Sender: TObject; Item: TListItem); + private + FStream: TJclCLRUserStringStream; + procedure ShowStrings(const AStream: TJclCLRUserStringStream); + public + class procedure Execute(const AStream: TJclCLRUserStringStream); + end; + +var + frmUserStrings: TfrmUserStrings; + +implementation + +{$R *.DFM} + +{ TfrmUserStrings } + +class procedure TfrmUserStrings.Execute(const AStream: TJclCLRUserStringStream); +begin + with TfrmUserStrings.Create(nil) do + try + ShowStrings(AStream); + ShowModal; + finally + Free; + end; +end; + +procedure TfrmUserStrings.ShowStrings(const AStream: TJclCLRUserStringStream); +begin + FStream := AStream; + lstStrings.Items.Count := FStream.StringCount; +end; + +procedure TfrmUserStrings.lstStringsData(Sender: TObject; Item: TListItem); +begin + Item.Caption := IntToStr(Item.Index); + Item.SubItems.Add(IntToHex(FStream.Offsets[Item.Index], 8)); + Item.SubItems.Add(FStream.Strings[Item.Index]); +end; + +end. diff --git a/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.dfm b/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.dfm new file mode 100644 index 0000000..3215e5b --- /dev/null +++ b/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.dfm @@ -0,0 +1,91 @@ +object Form1: TForm1 + Left = 192 + Top = 136 + ClientWidth = 782 + ClientHeight = 474 + Caption = 'Exception frame tracking example' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object mmLog: TMemo + Left = 172 + Top = 32 + Width = 610 + Height = 441 + Anchors = [akLeft, akTop, akRight, akBottom] + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object Button1: TButton + Left = 4 + Top = 32 + Width = 165 + Height = 25 + Caption = 'Assign to PChar(nil)' + TabOrder = 1 + OnClick = Button1Click + end + object Button2: TButton + Left = 4 + Top = 60 + Width = 165 + Height = 25 + Caption = 'try ... except' + TabOrder = 2 + OnClick = Button2Click + end + object Button3: TButton + Left = 4 + Top = 88 + Width = 165 + Height = 25 + Caption = 'try except on.... else' + TabOrder = 3 + OnClick = Button3Click + end + object Button4: TButton + Left = 4 + Top = 116 + Width = 165 + Height = 25 + Caption = 'try ... finally' + TabOrder = 4 + OnClick = Button4Click + end + object Button5: TButton + Left = 4 + Top = 144 + Width = 165 + Height = 25 + Caption = 'try try ... finally except' + TabOrder = 5 + OnClick = Button5Click + end + object chkShowAllFrames: TCheckBox + Left = 180 + Top = 8 + Width = 145 + Height = 17 + Caption = 'Show all exception frames' + TabOrder = 6 + end + object Button6: TButton + Left = 704 + Top = 4 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Clear' + TabOrder = 7 + OnClick = Button6Click + end +end diff --git a/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.pas b/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.pas new file mode 100644 index 0000000..f7f4966 --- /dev/null +++ b/official/1.100/examples/windows/debug/framestrack/FramesTrackDemoMain.pas @@ -0,0 +1,186 @@ +unit FramesTrackDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls; + +type + TForm1 = class(TForm) + mmLog: TMemo; + Button1: TButton; + Button2: TButton; + Button3: TButton; + Button4: TButton; + Button5: TButton; + chkShowAllFrames: TCheckBox; + Button6: TButton; + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure Button6Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure Button5Click(Sender: TObject); + private + { Private declarations } + procedure LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean); + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +uses + JclDebug, JclHookExcept, TypInfo; + +procedure TForm1.LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean); +var + TmpS: string; + ModInfo: TJclLocationInfo; + I: Integer; + ExceptionHandled: Boolean; + HandlerLocation: Pointer; + ExceptFrame: TJclExceptFrame; + +begin + TmpS := 'Exception ' + ExceptObj.ClassName; + if ExceptObj is Exception then + TmpS := TmpS + ': ' + Exception(ExceptObj).Message; + if IsOS then + TmpS := TmpS + ' (OS Exception)'; + mmLog.Lines.Add(TmpS); + ModInfo := GetLocationInfo(ExceptAddr); + mmLog.Lines.Add(Format( + ' Exception occured at $%p (Module "%s", Procedure "%s", Unit "%s", Line %d)', + [ModInfo.Address, + ModInfo.UnitName, + ModInfo.ProcedureName, + ModInfo.SourceName, + ModInfo.LineNumber])); + if stExceptFrame in JclStackTrackingOptions then + begin + mmLog.Lines.Add(' Except frame-dump:'); + I := 0; + ExceptionHandled := False; + while (chkShowAllFrames.Checked or not ExceptionHandled) and + (I < JclLastExceptFrameList.Count) do + begin + ExceptFrame := JclLastExceptFrameList.Items[I]; + ExceptionHandled := ExceptFrame.HandlerInfo(ExceptObj, HandlerLocation); + if (ExceptFrame.FrameKind = efkFinally) or + (ExceptFrame.FrameKind = efkUnknown) or + not ExceptionHandled then + HandlerLocation := ExceptFrame.CodeLocation; + ModInfo := GetLocationInfo(HandlerLocation); + TmpS := Format( + ' Frame at $%p (type: %s', + [ExceptFrame.ExcFrame, + GetEnumName(TypeInfo(TExceptFrameKind), Ord(ExceptFrame.FrameKind))]); + if ExceptionHandled then + TmpS := TmpS + ', handles exception)' + else + TmpS := TmpS + ')'; + mmLog.Lines.Add(TmpS); + if ExceptionHandled then + mmLog.Lines.Add(Format( + ' Handler at $%p', + [HandlerLocation])) + else + mmLog.Lines.Add(Format( + ' Code at $%p', + [HandlerLocation])); + mmLog.Lines.Add(Format( + ' Module "%s", Procedure "%s", Unit "%s", Line %d', + [ModInfo.UnitName, + ModInfo.ProcedureName, + ModInfo.SourceName, + ModInfo.LineNumber])); + Inc(I); + end; + end; + mmLog.Lines.Add(''); +end; + +procedure TForm1.FormCreate(Sender: TObject); +begin + JclAddExceptNotifier(Form1.LogException); +end; + +procedure TForm1.FormDestroy(Sender: TObject); +begin + JclRemoveExceptNotifier(Form1.LogException); +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + mmLog.Lines.Add(TButton(Sender).Caption); + PChar(nil)^ := 'a'; +end; + +procedure TForm1.Button6Click(Sender: TObject); +begin + mmLog.Lines.Clear; +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + mmLog.Lines.Add(TButton(Sender).Caption); + try + PChar(nil)^ := 'a'; + except + end; +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + mmLog.Lines.Add(TButton(Sender).Caption); + try + PChar(nil)^ := 'a'; + except + on E: EConvertError do + ShowMessage('EConvertError or descendant'); + on E: ERangeError do + ShowMessage('ERangeError or descendant'); + else + ShowMessage('Not EConvertError and not ERangeError') + end; +end; + +procedure TForm1.Button4Click(Sender: TObject); +begin + mmLog.Lines.Add(TButton(Sender).Caption); + try + PChar(nil)^ := 'a'; + finally + ShowMessage('finally!'); + end; +end; + +procedure TForm1.Button5Click(Sender: TObject); +begin + mmLog.Lines.Add(TButton(Sender).Caption); + try + try + PChar(nil)^ := 'a'; + finally + ShowMessage('Finally!'); + end; + except + ShowMessage('Except!'); + end; +end; + +initialization + + JclStackTrackingOptions := JclStackTrackingOptions + [stExceptFrame]; + JclStartExceptionTracking; + +end. diff --git a/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dof b/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dof new file mode 100644 index 0000000..e957ac9 --- /dev/null +++ b/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin + diff --git a/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dpr b/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dpr new file mode 100644 index 0000000..dd6c45c --- /dev/null +++ b/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.dpr @@ -0,0 +1,16 @@ +program FramesTrackExample; + +{$I jcl.inc} + +uses + Forms, + FramesTrackDemoMain in 'FramesTrackDemoMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.res b/official/1.100/examples/windows/debug/framestrack/FramesTrackExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.dpr b/official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.dpr new file mode 100644 index 0000000..97cad84 --- /dev/null +++ b/official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.dpr @@ -0,0 +1,18 @@ +program ExceptionReportConverter; + +{$I jcl.inc} + +uses + Forms, + formConverter in 'formConverter.pas' {frmConverter}, + ExceptDlgMail in '..\..\..\..\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.pas' {ExceptionDialogMail}; + +{$R *.res} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'Exception Report Converter'; + Application.CreateForm(TfrmConverter, frmConverter); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.res b/official/1.100/examples/windows/debug/reportconverter/ExceptionReportConverter.res new file mode 100644 index 0000000000000000000000000000000000000000..d8a552809ed6777a882d682ecdbd46969240e34e GIT binary patch literal 876 zcmZuw!D`h&6g_zf7)hzGAhf$aLTTM;$WpKsi^YZZABr?vc}QlbDP0)IqQCM=Hp1Pc zD}O_9WIIp@v{GZ_Gw5vo0y{u4hZqaM-|cx^g;xG|cZFqsiY zM1Y7bgEjw;3gCyT>N~bfi3(lUQLs%|r+vq^-y+-u9EQbN|3@1f#ULJWz-L%%kV7bHd+I z&uzl(1D8Hs44g-@ojSKC1CN__I!RL`gMmEr(rDm>#uFI~wb+3sBJ#oec<3~c1FaqJ zbI-Xh;IAW>Hm6Zo&n(YbXxs`K<|4JUHj&8JhWEi}2EOPi@5uCI+>jBA1*$-GL>Hp}XHFa%_xh_4YA$@r+R2#9O??8@wZ4;gtOt>+ix|Lx9;V@~^^PQGh?X=+Sln literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/reportconverter/formConverter.dfm b/official/1.100/examples/windows/debug/reportconverter/formConverter.dfm new file mode 100644 index 0000000..c1895f6 --- /dev/null +++ b/official/1.100/examples/windows/debug/reportconverter/formConverter.dfm @@ -0,0 +1,65 @@ +object frmConverter: TfrmConverter + Left = 227 + Top = 119 + ClientWidth = 454 + ClientHeight = 80 + Caption = 'Exception Report Converter' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object btnConvert: TButton + Left = 368 + Top = 9 + Width = 75 + Height = 25 + Caption = '&Convert' + TabOrder = 2 + OnClick = btnConvertClick + end + object txtReportFile: TEdit + Left = 8 + Top = 11 + Width = 313 + Height = 21 + TabOrder = 0 + Text = 'txtReportFile' + end + object txtMapFile: TEdit + Left = 8 + Top = 51 + Width = 313 + Height = 21 + TabOrder = 1 + Text = 'txtMapFile' + end + object btnReportFile: TButton + Left = 328 + Top = 9 + Width = 22 + Height = 25 + Caption = '...' + TabOrder = 3 + OnClick = btnReportFileClick + end + object btnMapFile: TButton + Left = 328 + Top = 49 + Width = 22 + Height = 25 + Caption = '...' + TabOrder = 4 + OnClick = btnMapFileClick + end + object dlgOpen: TOpenDialog + Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 392 + Top = 51 + end +end diff --git a/official/1.100/examples/windows/debug/reportconverter/formConverter.pas b/official/1.100/examples/windows/debug/reportconverter/formConverter.pas new file mode 100644 index 0000000..d154500 --- /dev/null +++ b/official/1.100/examples/windows/debug/reportconverter/formConverter.pas @@ -0,0 +1,194 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is formConverter.pas. } +{ } +{ The Initial Developer of the Original Code is Elahn Ientile } +{ Portions created by Elahn Ientile are Copyright (C) Elahn Ientile. } +{ } +{**************************************************************************************************} +{ } +{ Converts a report send by TExceptionDialogMail where no Debug Info or Map file was present into } +{ a report equivalent to one where Debug Info or Map file was present, i.e. inc. line numbers, etc } +{ } +{ Note: to generate a Map file on compile, add "-GD" to [project name].cfg } +{ the map file used must be the one generated when that copy of the program was compiled } +{ } +{ Unit owner: Elahn Ientile } +{ Last modified: $Date: 2006-09-03 11:36:16 +0200 (dim., 03 sept. 2006) $ } +{ } +{**************************************************************************************************} + +unit formConverter; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, JclDebug; + +type + TfrmConverter = class(TForm) + btnConvert: TButton; + txtReportFile: TEdit; + txtMapFile: TEdit; + btnReportFile: TButton; + btnMapFile: TButton; + dlgOpen: TOpenDialog; + procedure btnConvertClick(Sender: TObject); + procedure btnReportFileClick(Sender: TObject); + procedure btnMapFileClick(Sender: TObject); + private + FScanner: TJclMapScanner; + public + procedure ConvertFile(AMap, AInput, AOutput: TFileName); + function FormatInfo(var Info: TJclLocationInfo; + IncludeAddressOffset: Boolean = True; + IncludeStartProcLineOffset: Boolean = True): string; + function GetVALocationInfo(const VA: DWORD; var Info: TJclLocationInfo): Boolean; + end; + +var + frmConverter: TfrmConverter; + +implementation + +{$R *.dfm} + +procedure TfrmConverter.btnConvertClick(Sender: TObject); +var + lStr, lExt: string; +begin + if not FileExists(txtReportFile.Text) then + ShowMessage('Report File does not exist.') + else if not FileExists(txtMapFile.Text) then + ShowMessage('Map File does not exist.') + else + begin + lStr := txtReportFile.Text; + lExt := ExtractFileExt(lStr); + Insert('.converted', lStr, Length(lStr) + 1 - Length(lExt)); + ConvertFile(txtMapFile.Text, txtReportFile.Text, lStr); + end; +end; + +procedure TfrmConverter.ConvertFile(AMap, AInput, AOutput: TFileName); +var + ls: TStringList; + i: Integer; + lInStackList: Boolean; + s: string; + VA: DWORD; + Info: TJclLocationInfo; +begin + FScanner := TJclMapScanner.Create(AMap); + ls := TStringList.Create; + try + ls.LoadFromFile(AInput); + if ls.Count = 0 then + Exit; + lInStackList := False; + i := 0; + while i < ls.Count do + begin + if (Copy(ls[i], 1, 3) = '---') then + if lInStackList then + Break + else if Copy(ls[i+1], 1, 10) = 'Stack list' then + begin + lInStackList := True; + Inc(i, 2); + end; + if lInStackList and (Copy(ls[i], 1, 1) = '(') then + begin + s := '$' + Copy(ls[i], 2, 8); + VA := DWORD(StrToInt64(s)); + if GetVALocationInfo(VA, Info) then + ls[i] := ls[i] + FormatInfo(Info); + end; + Inc(i); + end; + ls.SaveToFile(AOutput); + ShowMessage('Successfully converted. Output filename:' + #13#10#13#10 + AOutput); + finally + ls.Free; + end; +end; + +function TfrmConverter.FormatInfo(var Info: TJclLocationInfo; + IncludeAddressOffset, IncludeStartProcLineOffset: Boolean): string; +var + StartProcInfo: TJclLocationInfo; + OffsetStr, StartProcOffsetStr: string; +begin + OffsetStr := ''; + with Info do + begin + if LineNumber > 0 then + begin + if IncludeStartProcLineOffset and GetVALocationInfo(DWORD(Cardinal(Info.Address) - + Cardinal(Info.OffsetFromProcName)), StartProcInfo) and (StartProcInfo.LineNumber > 0) then + StartProcOffsetStr := Format(' + %d', [LineNumber - StartProcInfo.LineNumber]) + else + StartProcOffsetStr := ''; + if IncludeAddressOffset then + begin + if OffsetFromLineNumber >= 0 then + OffsetStr := Format(' + $%x', [OffsetFromLineNumber]) + else + OffsetStr := Format(' - $%x', [-OffsetFromLineNumber]) + end; + Result := Format(' %s.%s (Line %u, "%s"%s)%s', [UnitName, ProcedureName, LineNumber, + SourceName, StartProcOffsetStr, OffsetStr]); + end + else + begin + if IncludeAddressOffset then + OffsetStr := Format(' + $%x', [OffsetFromProcName]); + if UnitName <> '' then + Result := Format(' %s.%s%s', [UnitName, ProcedureName, OffsetStr]) + else + Result := Format(' %s%s', [ProcedureName, OffsetStr]); + end; + end; +end; + +function TfrmConverter.GetVALocationInfo(const VA: DWORD; var Info: TJclLocationInfo): Boolean; +begin + with FScanner do + begin + Info.UnitName := ModuleNameFromAddr(VA); + Result := (Info.UnitName <> ''); + if Result then + begin + Info.Address := Pointer(VA); + Info.ProcedureName := ProcNameFromAddr(VA, Info.OffsetFromProcName); + Info.LineNumber := LineNumberFromAddr(VA, Info.OffsetFromLineNumber); + Info.SourceName := SourceNameFromAddr(VA); + Info.DebugInfo := nil; + end; + end; +end; + +procedure TfrmConverter.btnReportFileClick(Sender: TObject); +begin + if dlgOpen.Execute then + txtReportFile.Text := dlgOpen.FileName; +end; + +procedure TfrmConverter.btnMapFileClick(Sender: TObject); +begin + if dlgOpen.Execute then + txtMapFile.Text := dlgOpen.FileName; +end; + +end. diff --git a/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.dfm b/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.dfm new file mode 100644 index 0000000..30fdc88 --- /dev/null +++ b/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.dfm @@ -0,0 +1,134 @@ +object Form1: TForm1 + Left = 192 + Top = 107 + ClientWidth = 638 + ClientHeight = 485 + Caption = 'JclDebug Source location example' + Color = clBtnFace + Constraints.MinHeight = 300 + Constraints.MinWidth = 600 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 16 + Top = 40 + Width = 29 + Height = 13 + Caption = 'Level:' + FocusControl = LevelSpinEdit + end + object Label2: TLabel + Left = 136 + Top = 40 + Width = 67 + Height = 13 + Caption = 'Address (hex):' + FocusControl = AddrEdit + end + object Memo1: TMemo + Left = 0 + Top = 88 + Width = 638 + Height = 396 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object CallerBtn: TButton + Left = 16 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Caller()' + TabOrder = 1 + OnClick = CallerBtnClick + end + object LevelSpinEdit: TSpinEdit + Left = 16 + Top = 56 + Width = 89 + Height = 22 + MaxValue = 20 + MinValue = 0 + TabOrder = 2 + Value = 0 + end + object AddrBtn: TButton + Left = 136 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Address lookup' + TabOrder = 3 + OnClick = AddrBtnClick + end + object AddrEdit: TEdit + Left = 136 + Top = 56 + Width = 89 + Height = 21 + CharCase = ecUpperCase + MaxLength = 8 + TabOrder = 4 + Text = 'ADDREDIT' + end + object StackBtn: TButton + Left = 256 + Top = 8 + Width = 89 + Height = 25 + Caption = 'Stack dump' + TabOrder = 5 + OnClick = StackBtnClick + end + object TraceLocBtn: TButton + Left = 368 + Top = 8 + Width = 89 + Height = 25 + Caption = 'TraceLoc("text")' + TabOrder = 6 + OnClick = TraceLocBtnClick + end + object ProcBtn: TButton + Left = 480 + Top = 8 + Width = 81 + Height = 25 + Caption = '__PROC__' + TabOrder = 8 + OnClick = ProcBtnClick + end + object ModuleBtn: TButton + Left = 480 + Top = 48 + Width = 81 + Height = 25 + Caption = '__MODULE__' + TabOrder = 9 + OnClick = ModuleBtnClick + end + object RawCheckBox: TCheckBox + Left = 256 + Top = 40 + Width = 89 + Height = 17 + Caption = 'Raw' + TabOrder = 7 + end +end diff --git a/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.pas b/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.pas new file mode 100644 index 0000000..5b5c14b --- /dev/null +++ b/official/1.100/examples/windows/debug/sourceloc/SourceLocDemoMain.pas @@ -0,0 +1,124 @@ +unit SourceLocDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Spin; + +type + TForm1 = class(TForm) + Memo1: TMemo; + CallerBtn: TButton; + LevelSpinEdit: TSpinEdit; + AddrBtn: TButton; + AddrEdit: TEdit; + StackBtn: TButton; + Label1: TLabel; + Label2: TLabel; + TraceLocBtn: TButton; + ProcBtn: TButton; + ModuleBtn: TButton; + RawCheckBox: TCheckBox; + procedure CallerBtnClick(Sender: TObject); + procedure AddrBtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure StackBtnClick(Sender: TObject); + procedure TraceLocBtnClick(Sender: TObject); + procedure ProcBtnClick(Sender: TObject); + procedure ModuleBtnClick(Sender: TObject); + private + { Private declarations } + public + procedure ReportLocation(Addr: Pointer); + procedure ReportTime(T: Extended); + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +uses + JclCounter, JclDebug; + +procedure TForm1.FormCreate(Sender: TObject); +var + P: Pointer; +begin + P := @TForm1.AddrBtnClick; + AddrEdit.Text := IntToHex(Integer(P), 8); +end; + +procedure TForm1.ReportLocation(Addr: Pointer); +var + C: TJclCounter; + S: string; + T: Extended; +begin + StartCount(C); + S := GetLocationInfoStr(Addr, False, True, True); + T := StopCount(C); + Memo1.Lines.Add(S); + ReportTime(T); +end; + +procedure TForm1.ReportTime(T: Extended); +begin + Memo1.Lines.Add(Format('Time: %4.3f ms'#13#10, [T * 1000])); +end; + +procedure TForm1.CallerBtnClick(Sender: TObject); +begin + ReportLocation(Caller(LevelSpinEdit.Value)); +end; + +procedure TForm1.AddrBtnClick(Sender: TObject); +var + Addr: Pointer; +begin + Addr := Pointer(StrToInt('$' + Trim(AddrEdit.Text))); + ReportLocation(Addr); +end; + +procedure TForm1.StackBtnClick(Sender: TObject); +var + C: TJclCounter; + T: Extended; + SL: TStringList; +begin + SL := TStringList.Create; + try + StartCount(C); + with TJclStackInfoList.Create(RawCheckBox.Checked, 0, nil) do + try + AddToStrings(SL, False, True, True); + T := StopCount(C); + Memo1.Lines.AddStrings(SL); + ReportTime(T); + finally + Free; + end; + finally + SL.Free; + end; +end; + +procedure TForm1.TraceLocBtnClick(Sender: TObject); +begin + TraceLoc('text'); +end; + +procedure TForm1.ProcBtnClick(Sender: TObject); +begin + ShowMessage(ProcByLevel); +end; + +procedure TForm1.ModuleBtnClick(Sender: TObject); +begin + ShowMessage(ModuleByLevel); +end; + +end. diff --git a/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dof b/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dof new file mode 100644 index 0000000..e957ac9 --- /dev/null +++ b/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin + diff --git a/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dpr b/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dpr new file mode 100644 index 0000000..d266117 --- /dev/null +++ b/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.dpr @@ -0,0 +1,16 @@ +program SourceLocExample; + +{$I jcl.inc} + +uses + Forms, + SourceLocDemoMain in 'SourceLocDemoMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.res b/official/1.100/examples/windows/debug/sourceloc/SourceLocExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.bdsproj b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.bdsproj new file mode 100644 index 0000000..32e0e8f --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + StackTrackDLLsComLibrary.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\..\bin + + + + + + HOOK_DLL_EXCEPTIONS + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dof b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dof new file mode 100644 index 0000000..18ab99a --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin +Conditionals=HOOK_DLL_EXCEPTIONS diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dpr b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dpr new file mode 100644 index 0000000..3880412 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.dpr @@ -0,0 +1,20 @@ +library StackTrackDLLsComLibrary; + +uses + ComServ, JclHookExcept, + StackTrackDLLsComLibrary_TLB in 'StackTrackDLLsComLibrary_TLB.pas', + StackTrackDLLsComUnit in 'StackTrackDLLsComUnit.pas' {StackTrackDllsTest: CoClass}; + +exports + DllGetClassObject, + DllCanUnloadNow, + DllRegisterServer, + DllUnregisterServer; + +{$R *.TLB} + +{$R *.RES} + +begin + JclInitializeLibrariesHookExcept; +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.res b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.tlb b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary.tlb new file mode 100644 index 0000000000000000000000000000000000000000..ce1f5db14ce9b56e6c7cead68a0305cf21b7c955 GIT binary patch literal 1668 zcmd5-&r2IY6n>kgfr7L_MH1*?)B5A064M@nC#AYgAfjmkb0|uFt)M2RZWh#A3O)Ab zMZEUhgY?j=J++jA7xCb~V4(j&^nE)!GLf{GB;bRYH{bW>&HM70*{tNOe1HssJqdb_ zvJ53d6p+;2{Fqm1AKmz7GH&t!L>@dls_&x3+N zr$M6>P0i?u(vh!!yNMr$l_YhBKa$%tlidSoi4X?cgj^nq$aK;QZ+)BM_ zCuZGhNeF?x55=Id7cICez2x^ZcYJ_aa7Wa)q+gmN^yPcbEtYrk4o^#&OyfQ*< QJYJOi{^0GXzJtRVw+94&KmY&$ literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary_TLB.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary_TLB.pas new file mode 100644 index 0000000..d440ef8 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComLibrary_TLB.pas @@ -0,0 +1,97 @@ +unit StackTrackDLLsComLibrary_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1658 $ +// File generated on 1.8.2005 02:48:29 from Type Library described below. + +// ************************************************************************ // +// Type Lib: D:\Quellen\jedi\jcl\examples\vcl\debug\stacktrack\StackTrackDLLsComLibrary.tlb (1) +// IID\LCID: {D4935E5D-790E-48CA-B360-0165C1305153}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (F:\WINNT\system32\stdole2.tlb) +// (2) v4.0 StdVCL, (F:\WINNT\system32\STDVCL40.DLL) +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + StackTrackDLLsComLibraryMajorVersion = 1; + StackTrackDLLsComLibraryMinorVersion = 0; + + LIBID_StackTrackDLLsComLibrary: TGUID = '{D4935E5D-790E-48CA-B360-0165C1305153}'; + + IID_IStackTrackDllsTest: TGUID = '{26473046-CCEB-4671-9AB1-2216EF4D2164}'; + CLASS_StackTrackDllsTest: TGUID = '{DA3AEC52-1481-4119-B140-2157C7ADEC5B}'; +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IStackTrackDllsTest = interface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + StackTrackDllsTest = IStackTrackDllsTest; + + +// *********************************************************************// +// Interface: IStackTrackDllsTest +// Flags: (256) OleAutomation +// GUID: {26473046-CCEB-4671-9AB1-2216EF4D2164} +// *********************************************************************// + IStackTrackDllsTest = interface(IUnknown) + ['{26473046-CCEB-4671-9AB1-2216EF4D2164}'] + function Error1: HResult; stdcall; + function Error2: HResult; stdcall; + end; + +// *********************************************************************// +// The Class CoStackTrackDllsTest provides a Create and CreateRemote method to +// create instances of the default interface IStackTrackDllsTest exposed by +// the CoClass StackTrackDllsTest. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoStackTrackDllsTest = class + class function Create: IStackTrackDllsTest; + class function CreateRemote(const MachineName: string): IStackTrackDllsTest; + end; + +implementation + +uses ComObj; + +class function CoStackTrackDllsTest.Create: IStackTrackDllsTest; +begin + Result := CreateComObject(CLASS_StackTrackDllsTest) as IStackTrackDllsTest; +end; + +class function CoStackTrackDllsTest.CreateRemote(const MachineName: string): IStackTrackDllsTest; +begin + Result := CreateRemoteComObject(MachineName, CLASS_StackTrackDllsTest) as IStackTrackDllsTest; +end; + +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComUnit.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComUnit.pas new file mode 100644 index 0000000..d4c37f9 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsComUnit.pas @@ -0,0 +1,38 @@ +unit StackTrackDLLsComUnit; + +interface + +uses + Windows, ActiveX, Classes, ComObj, StackTrackDLLsComLibrary_TLB, StdVcl; + +type + TStackTrackDllsTest = class(TTypedComObject, IStackTrackDllsTest) + protected + function Error1: HResult; stdcall; + function Error2: HResult; stdcall; + end; + +implementation + +uses ComServ, SysUtils; + +procedure Error1_1; +begin + StrToInt('x'); +end; + +function TStackTrackDllsTest.Error1: HResult; +begin + Error1_1; + Result := S_FALSE; +end; + +function TStackTrackDllsTest.Error2: HResult; +begin + raise Exception.Create('Exception from IDllExceptTestObject.Error2'); +end; + +initialization + TTypedComObjectFactory.Create(ComServer, TStackTrackDllsTest, Class_StackTrackDllsTest, + ciMultiInstance, tmApartment); +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.dfm b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.dfm new file mode 100644 index 0000000..bf364b7 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.dfm @@ -0,0 +1,115 @@ +object MainForm: TMainForm + Left = 555 + Top = 318 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = bsSingle + Caption = 'Exceptions in DLLs example' + ClientHeight = 296 + ClientWidth = 235 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object StaticLibGroupBox: TGroupBox + Left = 8 + Top = 8 + Width = 217 + Height = 65 + Caption = 'Statically linked library' + TabOrder = 0 + object StaticLibError1Btn: TButton + Left = 23 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Error1' + TabOrder = 0 + OnClick = StaticLibError1BtnClick + end + object StaticLibError2Btn: TButton + Left = 119 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Error2' + TabOrder = 1 + OnClick = StaticLibError2BtnClick + end + end + object ComObjGroupBox: TGroupBox + Left = 8 + Top = 216 + Width = 217 + Height = 65 + Caption = 'COM object' + TabOrder = 1 + object ComObjErr1Btn: TButton + Left = 23 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Error1' + TabOrder = 0 + OnClick = ComObjErr1BtnClick + end + object ComObjErr2Btn: TButton + Left = 119 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Error2' + TabOrder = 1 + OnClick = ComObjErr2BtnClick + end + end + object DynLibGroupBox: TGroupBox + Left = 8 + Top = 88 + Width = 217 + Height = 113 + Caption = 'Dynamically linked library' + TabOrder = 2 + object DynamicLibError1Btn: TButton + Left = 23 + Top = 64 + Width = 75 + Height = 25 + Caption = 'Error1' + TabOrder = 0 + OnClick = DynamicLibError1BtnClick + end + object DynamicLibError2Btn: TButton + Left = 119 + Top = 64 + Width = 75 + Height = 25 + Caption = 'Error2' + TabOrder = 1 + OnClick = DynamicLibError2BtnClick + end + object LoadLibBtn: TButton + Left = 23 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Load' + TabOrder = 2 + OnClick = LoadLibBtnClick + end + object FreeLibBtn: TButton + Left = 119 + Top = 24 + Width = 75 + Height = 25 + Caption = 'Free' + TabOrder = 3 + OnClick = FreeLibBtnClick + end + end +end diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.pas new file mode 100644 index 0000000..cde7fe8 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDemoMain.pas @@ -0,0 +1,130 @@ +unit StackTrackDLLsDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls; + +type + TMainForm = class(TForm) + StaticLibError1Btn: TButton; + StaticLibError2Btn: TButton; + StaticLibGroupBox: TGroupBox; + ComObjGroupBox: TGroupBox; + ComObjErr1Btn: TButton; + ComObjErr2Btn: TButton; + DynLibGroupBox: TGroupBox; + DynamicLibError1Btn: TButton; + DynamicLibError2Btn: TButton; + LoadLibBtn: TButton; + FreeLibBtn: TButton; + procedure StaticLibError1BtnClick(Sender: TObject); + procedure StaticLibError2BtnClick(Sender: TObject); + procedure ComObjErr1BtnClick(Sender: TObject); + procedure ComObjErr2BtnClick(Sender: TObject); + procedure DynamicLibError1BtnClick(Sender: TObject); + procedure DynamicLibError2BtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure LoadLibBtnClick(Sender: TObject); + procedure FreeLibBtnClick(Sender: TObject); + private + FLibHandle: THandle; + public + procedure UpdateButtons; + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +uses + JclBase, StackTrackDLLsComLibrary_TLB; + +const + StaticLibrary = 'StackTrackDLLsStaticLibrary.dll'; + DynamicLibrary = 'StackTrackDLLsDynamicLibrary.dll'; + +procedure Error1; stdcall; external StaticLibrary; +procedure Error2; stdcall; external StaticLibrary; + +{ TMainForm } + +procedure TMainForm.FormCreate(Sender: TObject); +begin + UpdateButtons; +end; + +procedure TMainForm.StaticLibError1BtnClick(Sender: TObject); +begin + Error1; +end; + +procedure TMainForm.StaticLibError2BtnClick(Sender: TObject); +begin + Error2; +end; + +procedure TMainForm.ComObjErr1BtnClick(Sender: TObject); +var + I: IStackTrackDllsTest; +begin + I := CoStackTrackDllsTest.Create; + I.Error1; +end; + +procedure TMainForm.ComObjErr2BtnClick(Sender: TObject); +var + I: IStackTrackDllsTest; +begin + I := CoStackTrackDllsTest.Create; + I.Error2; +end; + +procedure TMainForm.LoadLibBtnClick(Sender: TObject); +begin + FLibHandle := LoadLibrary(DynamicLibrary); + UpdateButtons; + if FLibHandle = 0 then + RaiseLastOSError; +end; + +procedure TMainForm.FreeLibBtnClick(Sender: TObject); +begin + FreeLibrary(FLibHandle); + FLibHandle := 0; + UpdateButtons; +end; + +procedure TMainForm.DynamicLibError1BtnClick(Sender: TObject); +var + _Error1: procedure; stdcall; +begin + @_Error1 := GetProcAddress(FLibHandle, 'Error1'); + if not Assigned(_Error1) then + RaiseLastOSError; + _Error1; +end; + +procedure TMainForm.DynamicLibError2BtnClick(Sender: TObject); +var + _Error2: procedure; stdcall; +begin + @_Error2 := GetProcAddress(FLibHandle, 'Error2'); + if not Assigned(_Error2) then + RaiseLastOSError; + _Error2; +end; + +procedure TMainForm.UpdateButtons; +begin + LoadLibBtn.Enabled := (FLibHandle = 0); + FreeLibBtn.Enabled := (FLibHandle <> 0); + DynamicLibError1Btn.Enabled := (FLibHandle <> 0); + DynamicLibError2Btn.Enabled := (FLibHandle <> 0); +end; + +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.bdsproj b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.bdsproj new file mode 100644 index 0000000..dcc7f08 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + StackTrackDLLsDynamicLibrary.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\..\bin + + + + + + HOOK_DLL_EXCEPTIONS + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dof b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dof new file mode 100644 index 0000000..18ab99a --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin +Conditionals=HOOK_DLL_EXCEPTIONS diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dpr b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dpr new file mode 100644 index 0000000..6470da7 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.dpr @@ -0,0 +1,15 @@ +library StackTrackDLLsDynamicLibrary; + +uses + SysUtils, + JclHookExcept, + StackTrackDLLsDynamicUnit in 'StackTrackDLLsDynamicUnit.pas'; + +{$R *.res} + +exports + Error1, Error2; + +begin + JclInitializeLibrariesHookExcept; +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.res b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicLibrary.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicUnit.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicUnit.pas new file mode 100644 index 0000000..2b92f16 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsDynamicUnit.pas @@ -0,0 +1,28 @@ +unit StackTrackDLLsDynamicUnit; + +interface + +procedure Error1; stdcall; +procedure Error2; stdcall; + +implementation + +uses + SysUtils; + +procedure Error1_1; +begin + StrToInt('x'); +end; + +procedure Error1; stdcall; +begin + Error1_1; +end; + +procedure Error2; stdcall; +begin + raise Exception.Create('Exception from StaticLibrary.dll'); +end; + +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.bdsproj b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.bdsproj new file mode 100644 index 0000000..ef3bf94 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + StackTrackDLLsExample.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\..\bin + + + + + + HOOK_DLL_EXCEPTIONS + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dof b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dof new file mode 100644 index 0000000..18ab99a --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin +Conditionals=HOOK_DLL_EXCEPTIONS diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dpr b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dpr new file mode 100644 index 0000000..a034fb8 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.dpr @@ -0,0 +1,17 @@ +program StackTrackDLLsExample; + +{$I jcl.inc} + +uses + Forms, + StackTrackDLLsDemoMain in 'StackTrackDLLsDemoMain.pas' {MainForm}, + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}; + +{$R *.res} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.res b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.bdsproj b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.bdsproj new file mode 100644 index 0000000..cbba2ac --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + StackTrackDLLsStaticLibrary.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\..\bin + + + + + + HOOK_DLL_EXCEPTIONS + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dof b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dof new file mode 100644 index 0000000..18ab99a --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin +Conditionals=HOOK_DLL_EXCEPTIONS diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dpr b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dpr new file mode 100644 index 0000000..2584a09 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.dpr @@ -0,0 +1,15 @@ +library StackTrackDLLsStaticLibrary; + +uses + SysUtils, + JclHookExcept, + StackTrackDLLsStaticUnit in 'StackTrackDLLsStaticUnit.pas'; + +{$R *.res} + +exports + Error1, Error2; + +begin + JclInitializeLibrariesHookExcept; +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.res b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticLibrary.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticUnit.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticUnit.pas new file mode 100644 index 0000000..3b3922e --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDLLsStaticUnit.pas @@ -0,0 +1,28 @@ +unit StackTrackDLLsStaticUnit; + +interface + +procedure Error1; stdcall; +procedure Error2; stdcall; + +implementation + +uses + SysUtils; + +procedure Error1_1; +begin + StrToInt('x'); +end; + +procedure Error1; stdcall; +begin + Error1_1; +end; + +procedure Error2; stdcall; +begin + raise Exception.Create('Exception from StaticLibrary.dll'); +end; + +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.dfm b/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.dfm new file mode 100644 index 0000000..d1ffa55 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.dfm @@ -0,0 +1,95 @@ +object MainForm: TMainForm + Left = 342 + Top = 197 + ClientWidth = 606 + ClientHeight = 497 + Caption = 'Tracking unhandled exceptions in VCL application' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 0 + Top = 64 + Width = 64 + Height = 13 + Caption = '&Exception log' + FocusControl = ExceptionLogMemo + end + object ExceptionLogMemo: TMemo + Left = 0 + Top = 80 + Width = 606 + Height = 416 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + object Button1: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Error1' + TabOrder = 1 + OnClick = Button1Click + end + object Button2: TButton + Left = 88 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Error2' + TabOrder = 2 + OnClick = Button2Click + end + object Button3: TButton + Left = 168 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Error3' + TabOrder = 3 + OnClick = Button3Click + end + object ListBox1: TListBox + Left = 472 + Top = 8 + Width = 73 + Height = 49 + ItemHeight = 13 + TabOrder = 4 + Visible = False + end + object Button4: TButton + Left = 248 + Top = 8 + Width = 75 + Height = 25 + Caption = 'Error4' + TabOrder = 5 + OnClick = Button4Click + end + object ApplicationEvents: TApplicationEvents + OnException = ApplicationEventsException + Left = 8 + Top = 440 + end + object ActionList1: TActionList + Left = 440 + Top = 8 + end +end diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.pas b/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.pas new file mode 100644 index 0000000..93cec82 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackDemoMain.pas @@ -0,0 +1,110 @@ +unit StackTrackDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, AppEvnts, ActnList; + +type + TMainForm = class(TForm) + ExceptionLogMemo: TMemo; + Button1: TButton; + Button2: TButton; + Button3: TButton; + ListBox1: TListBox; + Button4: TButton; + ApplicationEvents: TApplicationEvents; + Label1: TLabel; + ActionList1: TActionList; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure ApplicationEventsException(Sender: TObject; E: Exception); + private + { Private declarations } + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.DFM} + +uses + JclDebug; + +{ TMainForm } + +//-------------------------------------------------------------------------------------------------- +// Simulation of various unhandled exceptions +//-------------------------------------------------------------------------------------------------- + +procedure TMainForm.Button1Click(Sender: TObject); +begin + PInteger(nil)^ := 0; +end; + +procedure TMainForm.Button2Click(Sender: TObject); +begin + ListBox1.Items[1] := 'a'; +end; + +procedure AAA; +begin + PInteger(nil)^ := 0; +end; + +procedure TMainForm.Button3Click(Sender: TObject); +begin + AAA; +end; + +procedure TMainForm.Button4Click(Sender: TObject); +begin + ActionList1.Actions[0].Execute; +end; + +//-------------------------------------------------------------------------------------------------- +// Simple VCL application unhandled exception handler using JclDebug +//-------------------------------------------------------------------------------------------------- + +procedure TMainForm.ApplicationEventsException(Sender: TObject; E: Exception); +begin + // Log time stamp + ExceptionLogMemo.Lines.Add(DateTimeToStr(Now)); + + // Log unhandled exception stack info to ExceptionLogMemo + JclLastExceptStackListToStrings(ExceptionLogMemo.Lines, False, True, True, False); + + // Insert empty line + ExceptionLogMemo.Lines.Add(''); + + // Display default VCL unhandled exception dialog + Application.ShowException(E); +end; + +//-------------------------------------------------------------------------------------------------- +// JclDebug initialization and finalization for VCL application +//-------------------------------------------------------------------------------------------------- + +initialization + + // Enable raw mode (default mode uses stack frames which aren't always generated by the compiler) + Include(JclStackTrackingOptions, stRawMode); + // Disable stack tracking in dynamically loaded modules (it makes stack tracking code a bit faster) + Include(JclStackTrackingOptions, stStaticModuleList); + + // Initialize Exception tracking + JclStartExceptionTracking; + +finalization + + // Uninitialize Exception tracking + JclStopExceptionTracking; + +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.bdsproj b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.bdsproj new file mode 100644 index 0000000..c75588d --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + StackTrackExample.dpr + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + + + + ..\..\..\..\bin + + + + + + HOOK_DLL_EXCEPTIONS + + False + + + + + + False + + + True + False + + + + $00000000 + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1031 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dof b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dof new file mode 100644 index 0000000..18ab99a --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dof @@ -0,0 +1,3 @@ +[Directories] +OutputDir=..\..\..\..\bin +Conditionals=HOOK_DLL_EXCEPTIONS diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dpr b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dpr new file mode 100644 index 0000000..26cacb4 --- /dev/null +++ b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.dpr @@ -0,0 +1,16 @@ +program StackTrackExample; + +{$I jcl.inc} + +uses + Forms, + StackTrackDemoMain in 'StackTrackDemoMain.pas' {MainForm}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.res b/official/1.100/examples/windows/debug/stacktrack/StackTrackExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.dfm b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.dfm new file mode 100644 index 0000000..6e7b376 --- /dev/null +++ b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.dfm @@ -0,0 +1,93 @@ +object MainForm: TMainForm + Left = 286 + Top = 169 + Caption = + 'Exception tracking in threads and IDE Thread Status window exten' + + 'sion demo' + ClientHeight = 557 + ClientWidth = 715 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 63 + Height = 13 + Caption = 'Thread name' + FocusControl = ThreadNameEdit + end + object Label2: TLabel + Left = 8 + Top = 248 + Width = 55 + Height = 13 + Caption = 'Exceprtions' + end + object MessageRichEdit: TRichEdit + Left = 8 + Top = 264 + Width = 697 + Height = 289 + Anchors = [akLeft, akTop, akRight, akBottom] + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + PlainText = True + ReadOnly = True + TabOrder = 0 + WordWrap = False + end + object ThreadsRichEdit: TRichEdit + Left = 168 + Top = 8 + Width = 537 + Height = 249 + Anchors = [akLeft, akTop, akRight] + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + ParentFont = False + PlainText = True + ReadOnly = True + TabOrder = 1 + WordWrap = False + end + object CreateThreadBtn: TButton + Left = 8 + Top = 56 + Width = 75 + Height = 25 + Caption = 'Create Thread' + TabOrder = 2 + OnClick = CreateThreadBtnClick + end + object ThreadNameEdit: TEdit + Left = 8 + Top = 24 + Width = 121 + Height = 21 + TabOrder = 3 + end + object ListThreadsBtn: TButton + Left = 8 + Top = 96 + Width = 75 + Height = 25 + Caption = 'List Threads' + TabOrder = 4 + OnClick = ListThreadsBtnClick + end +end diff --git a/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.pas b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.pas new file mode 100644 index 0000000..10b523e --- /dev/null +++ b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptDemoMain.pas @@ -0,0 +1,166 @@ +unit ThreadExceptDemoMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ComCtrls, JclDebug; + +type + TDemoThread = class(TJclDebugThread) + private + procedure SomeErrorHere; + protected + procedure Execute; override; + end; + + TMainForm = class(TForm) + MessageRichEdit: TRichEdit; + ThreadsRichEdit: TRichEdit; + CreateThreadBtn: TButton; + ThreadNameEdit: TEdit; + ListThreadsBtn: TButton; + Label1: TLabel; + Label2: TLabel; + procedure FormCreate(Sender: TObject); + procedure CreateThreadBtnClick(Sender: TObject); + procedure ListThreadsBtnClick(Sender: TObject); + private + procedure DoThreadSyncException(Thread: TJclDebugThread); + procedure DoThreadRegistered(ThreadID: DWORD); + procedure DoThreadUnregistered(ThreadID: DWORD); + public + ThreadCnt: Integer; + function GetNewThreadName: string; + procedure ScrollDownRichEdit(RichEdit: TRichEdit); + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +{ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } +{ } +{ You have to install ThreadNameExpert package located in "\experts\debug\threadnames" } +{ } +{ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } + +{$DEFINE IdeThreadStatusWindowExtension} + +{$IFDEF IdeThreadStatusWindowExtension} +uses + JclIdeThreadStatus; +{$ENDIF} + +{ TDemoThread } + +procedure TDemoThread.Execute; +var + I: Integer; +begin + try + I := 0; + while not Terminated and (I < 5) do + begin + Sleep(2000); + MessageBeep(0); + try + SomeErrorHere; + except + HandleException; + end; + Inc(I); + {$IFDEF IdeThreadStatusWindowExtension} + // You can change Thread Name displayed in Thread Status Window in code. This does not change + // TDemoThread.ThreadName property value + // ChangeThreadName(Self, Format('I = %d', [I])); + {$ENDIF} + end; + except + HandleException; + end; +end; + +procedure TDemoThread.SomeErrorHere; +begin + // Set Breakpoint on "begin", uncheck "Break" and check "Ingore subsequent exceptions" in + // dialog advanced breakpoint actions + StrToInt('x'); +end; + +{ TMainForm } + +procedure TMainForm.DoThreadRegistered(ThreadID: DWORD); +begin + ThreadsRichEdit.Lines.Add(Format('Thread registered: %s', [JclDebugThreadList.ThreadInfos[ThreadID]])); + ScrollDownRichEdit(ThreadsRichEdit); +end; + +procedure TMainForm.DoThreadSyncException(Thread: TJclDebugThread); +begin + MessageRichEdit.Lines.Add(Format('Exception in thread: %s', [Thread.ThreadInfo])); + // Note: JclLastExceptStackList always returns list for *current* thread ID. To simplify getting the + // stack of thread where an exception occured JclLastExceptStackList returns stack of the thread instead + // of current thread when called *within* the JclDebugThreadList.OnSyncException handler. This is the + // *only* exception to the behavior of JclLastExceptStackList described above. + JclLastExceptStackList.AddToStrings(MessageRichEdit.Lines, False, True, True); + ScrollDownRichEdit(MessageRichEdit); +end; + +procedure TMainForm.DoThreadUnregistered(ThreadID: DWORD); +begin + ThreadsRichEdit.Lines.Add(Format('Thread unregistered: %s', [JclDebugThreadList.ThreadInfos[ThreadID]])); + ScrollDownRichEdit(ThreadsRichEdit); +end; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + with JclDebugThreadList do + begin + OnSyncException := DoThreadSyncException; + OnThreadRegistered := DoThreadRegistered; + OnThreadUnregistered := DoThreadUnregistered; + end; + ThreadNameEdit.Text := GetNewThreadName; +end; + +function TMainForm.GetNewThreadName: string; +begin + Inc(ThreadCnt); + Result := Format('Thread%d', [ThreadCnt]); +end; + +procedure TMainForm.CreateThreadBtnClick(Sender: TObject); +var + DemoThread: TDemoThread; +begin + DemoThread := TDemoThread.Create(True, ThreadNameEdit.Text); + DemoThread.FreeOnTerminate := True; + DemoThread.Resume; + ThreadNameEdit.Text := GetNewThreadName; +end; + +procedure TMainForm.ListThreadsBtnClick(Sender: TObject); +var + I: Integer; +begin + ThreadsRichEdit.Lines.Add('List of registered threads:'); + with JclDebugThreadList do + for I := 0 to ThreadIDCount - 1 do + ThreadsRichEdit.Lines.Add(ThreadInfos[ThreadIDs[I]]); + ScrollDownRichEdit(ThreadsRichEdit); +end; + +procedure TMainForm.ScrollDownRichEdit(RichEdit: TRichEdit); +begin + SendMessage(RichEdit.Handle, EM_SCROLLCARET, 0, 0); +end; + +initialization + Include(JclStackTrackingOptions, stRawMode); + JclStartExceptionTracking; + +end. diff --git a/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dof b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dof new file mode 100644 index 0000000..9acd2cf --- /dev/null +++ b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dof @@ -0,0 +1,4 @@ +[Directories] +OutputDir=../../../../bin + + diff --git a/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dpr b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dpr new file mode 100644 index 0000000..9efd090 --- /dev/null +++ b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.dpr @@ -0,0 +1,18 @@ +program ThreadExceptExample; + +{$I jcl.inc} + +uses + Forms, + JclIdeThreadStatus in '..\..\..\..\experts\debug\threadnames\JclIdeThreadStatus.pas', + ThreadExpertSharedNames in '..\..\..\..\experts\debug\threadnames\ThreadExpertSharedNames.pas', + ThreadExceptDemoMain in 'ThreadExceptDemoMain.pas' {MainForm}; + +{$R *.res} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.res b/official/1.100/examples/windows/debug/threadexcept/ThreadExceptExample.res new file mode 100644 index 0000000000000000000000000000000000000000..472f2e47297a46cf06bb2ce0c8024f600e93445f GIT binary patch literal 876 zcmb7Dv2N5r5S`;9xg)W{DJ54@#)?ixq5woi0mwzzd`4C)-)wZn8KKjRL~&IVegsim z<4;MMl8!BqmN)jD1QHD+KkvSIvoqseFA>ok$aw^&f7!#MgFZ#fWYA7dilal&Gfd{d zD_}xo0Hra(u1-$Sq_Y{=t)_t=*?Vay!e$CjOQd&(lrSF0Tls2mP+KZU0$}{QB){?Cac-k=ge)P zs@#gmop0R8g}oxl?IPC5q$+ilyo8%O(__-l!GrVd4Js^S-iEqTry#JnP8vd!s;FDl zq;Z||>|&v=4zWd2S?5$WWh!|QKY>F}P3_f(5WOWpd|j7mcHv`Ne;>F+kC;*qx`@}N zI@2b!D425=SVC0ra{+0Ysaf8YfGz8My5jwi7&srkpXp z9NZS0rZ02XvDWFgVg)9vo;QjnQKSDp@U9?#Ex_7v>500o()q z9vw!*|5}IN*3c784fkjixsOrfDQdkOu0=o1Pl)Io$oVn7qu2D7-UDyw1IB~>c`xiX POlUqo8g7N%q6z&5v1T5M literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/delphitools/DelphiToolsGroup.bpg b/official/1.100/examples/windows/delphitools/DelphiToolsGroup.bpg new file mode 100644 index 0000000..7a36fb3 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/DelphiToolsGroup.bpg @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = DependView.exe PeViewer.exe ToolHelpViewer.exe ResFix.exe \ + ScreenJPG.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +DependView.exe: DependencyViewer\DependView.dpr + $(DCC) + +PeViewer.exe: PeViewer\PeViewer.dpr + $(DCC) + +ToolHelpViewer.exe: ToolHelpView\ToolHelpViewer.dpr + $(DCC) + +ResFix.exe: ResFix\ResFix.dpr + $(DCC) + +ScreenJPG.exe: ScreenJPG\ScreenJPG.dpr + $(DCC) + + diff --git a/official/1.100/examples/windows/delphitools/Readme.txt b/official/1.100/examples/windows/delphitools/Readme.txt new file mode 100644 index 0000000..ad67294 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/Readme.txt @@ -0,0 +1,24 @@ +------------------------------------------------------------------------------- +* DELPHI OPEN SOURCE TOOLS 0.5.4 * +------------------------------------------------------------------------------- + +License: +-------- + +Mozilla Public License Ver. 1.1 +You may obtain a copy of the License at http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for +the specific language governing rights and limitations under the License. + + +Source code: +------------ + +The source code of these tools is intended for Delphi 5.01 (Update Pack #1 is +*required* due some fixes in the VCL) or Delphi 6.02. You will also need JEDI +Code Libary: + +Delphi Tools : http://www.volweb.cz/pvones/delphi +JEDI Code Library: http://delphi-jedi.org/Jedi:CODELIBJCL diff --git a/official/1.100/examples/windows/delphitools/common/About.dfm b/official/1.100/examples/windows/delphitools/common/About.dfm new file mode 100644 index 0000000..b4ca5ee --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/About.dfm @@ -0,0 +1,74 @@ +object AboutBox: TAboutBox + Left = 306 + Top = 208 + BorderStyle = bsDialog + Caption = 'About ...' + ClientHeight = 164 + ClientWidth = 258 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + ShowHint = True + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object IconPaintBox: TPaintBox + Left = 8 + Top = 8 + Width = 32 + Height = 32 + OnPaint = IconPaintBoxPaint + end + object Bevel1: TBevel + Left = 56 + Top = 121 + Width = 193 + Height = 14 + Anchors = [akLeft, akRight, akBottom] + Shape = bsTopLine + end + object ProductNameLabel: TLabel + Left = 56 + Top = 16 + Width = 108 + Height = 13 + Caption = 'ProductNameLabel' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object VersionLabel: TLabel + Left = 56 + Top = 40 + Width = 61 + Height = 13 + Caption = 'VersionLabel' + end + object CompanyLabel: TLabel + Left = 56 + Top = 64 + Width = 70 + Height = 13 + Caption = 'CompanyLabel' + end + object OkBtn: TButton + Left = 174 + Top = 133 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + end +end diff --git a/official/1.100/examples/windows/delphitools/common/About.pas b/official/1.100/examples/windows/delphitools/common/About.pas new file mode 100644 index 0000000..1c21e43 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/About.pas @@ -0,0 +1,180 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is About.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit About; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ExtCtrls; + +type + TAboutBox = class(TForm) + IconPaintBox: TPaintBox; + OkBtn: TButton; + Bevel1: TBevel; + ProductNameLabel: TLabel; + VersionLabel: TLabel; + CompanyLabel: TLabel; + procedure FormCreate(Sender: TObject); + procedure IconPaintBoxPaint(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FLinks: array of string; + FURLSpacing: Integer; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + function GetLinkCaption(Index: Integer): string; + function GetLinkURL(Index: Integer): string; + procedure OpenURL(const UrlName: String); + procedure UpdateLinkLabel(L: LPARAM; Activate: Boolean); + procedure UrlLinkLabelClick(Sender: TObject); + end; + +procedure ShowAbout(const Links: array of string; Spacing: Integer = 20); + +var + AboutBox: TAboutBox; + +implementation + +{$R *.DFM} + +uses + ShellAPI, JclFileUtils; + +procedure ShowAbout(const Links: array of string; Spacing: Integer); +var + I: Integer; +begin + with TAboutBox.Create(Application) do + try + SetLength(FLinks, High(Links) + 1); + for I := Low(Links) to High(Links) do + FLinks[I] := Links[I]; + FURLSpacing := Spacing; + ShowModal; + finally + Free; + end; +end; + +{ TAboutBox } + +procedure TAboutBox.CMMouseEnter(var Message: TMessage); +begin + inherited; + UpdateLinkLabel(Message.LParam, True); +end; + +procedure TAboutBox.CMMouseLeave(var Message: TMessage); +begin + inherited; + UpdateLinkLabel(Message.LParam, False); +end; + +procedure TAboutBox.FormCreate(Sender: TObject); +begin + with IconPaintBox do + begin + Width := GetSystemMetrics(SM_CXICON); + Height := GetSystemMetrics(SM_CYICON); + end; + with TJclFileVersionInfo.Create(Application.ExeName) do + try + ProductNameLabel.Caption := ProductName; + VersionLabel.Caption := Format('Version: %s', [ProductVersion]); + CompanyLabel.Caption := LegalCopyright; + finally + Free; + end; +end; + +procedure TAboutBox.FormShow(Sender: TObject); +var + I: Integer; +begin + I := Length(FLinks) * FURLSpacing - 20; + if I > 0 then Height := Height + I; + for I := 0 to Length(FLinks) - 1 do + with TLabel.Create(Self) do + begin + Parent := Self; + SetBounds(CompanyLabel.Left, I * FURLSpacing + CompanyLabel.Top + 25, 0, 0); + Caption := GetLinkCaption(I); + Cursor := crHandPoint; + Font.Color := clBlue; + Font.Style := [fsUnderline]; + Hint := GetLinkURL(I); + Tag := I + 1; + OnClick := UrlLinkLabelClick; + end; +end; + +function TAboutBox.GetLinkCaption(Index: Integer): string; +begin + Result := FLinks[Index]; + Result := Copy(Result, 1, Pos(';', Result) - 1); +end; + +function TAboutBox.GetLinkURL(Index: Integer): string; +begin + Result := FLinks[Index]; + Delete(Result, 1, Pos(';', Result)); +end; + +procedure TAboutBox.IconPaintBoxPaint(Sender: TObject); +begin + IconPaintBox.Canvas.Draw(0, 0, Application.Icon); +end; + +procedure TAboutBox.OpenURL(const UrlName: String); +var + Sei: TShellExecuteInfo; +begin + ZeroMemory(@Sei, Sizeof(Sei)); + Sei.cbSize := Sizeof(Sei); + Sei.Wnd := Application.Handle; + Sei.lpFile := PChar(UrlName); + Sei.nShow := SW_SHOWNORMAL; + ShellExecuteEx(@Sei); +end; + +procedure TAboutBox.UpdateLinkLabel(L: LPARAM; Activate: Boolean); +begin + if (TObject(L) is TLabel) and (TLabel(L).Tag > 0) then + with TLabel(L).Font do + if Activate then Color := clPurple else Color := clBlue; +end; + +procedure TAboutBox.UrlLinkLabelClick(Sender: TObject); +begin + OpenURL(GetLinkURL(TLabel(Sender).Tag - 1)); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/common/D6MdiMsgFix.pas b/official/1.100/examples/windows/delphitools/common/D6MdiMsgFix.pas new file mode 100644 index 0000000..665734a --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/D6MdiMsgFix.pas @@ -0,0 +1,85 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is D6MdiMsgFix.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit D6MdiMsgFix; + +interface + +{$I jcl.inc} + +implementation + +{$IFDEF DELPHI6} + +uses + Windows, Classes, SysUtils, Forms, AppEvnts; + +type + TFixApplicationEvents = class(TCustomApplicationEvents) + protected + procedure ApplicationEventsMessage(var Msg: TMsg; var Handled: Boolean); + public + constructor Create(AOwner: TComponent); override; + end; + + TApplicationAccess = class(TApplication); + +var + FixApplicationEvents: TFixApplicationEvents; + +{ TFixApplicationEvents } + +procedure TFixApplicationEvents.ApplicationEventsMessage(var Msg: TMsg; var Handled: Boolean); +begin + with Application do + if Assigned(MainForm) and (MainForm.FormStyle = fsMDIForm) and + Assigned(Screen.ActiveForm) and (Screen.ActiveForm.FormStyle <> fsMdiChild) then + begin + Handled := True; + with TApplicationAccess(Application) do + if not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then + begin + // prevent to call buggy TApplication.IsMDIMsg method, handle message here + TranslateMessage(Msg); + DispatchMessage(Msg); + end; + end; +end; + +constructor TFixApplicationEvents.Create(AOwner: TComponent); +begin + inherited; + OnMessage := ApplicationEventsMessage; +end; + +initialization + FixApplicationEvents := TFixApplicationEvents.Create(nil); + +finalization + FreeAndNil(FixApplicationEvents); + +{$ENDIF DELPHI6} + +end. diff --git a/official/1.100/examples/windows/delphitools/common/FindDlg.dfm b/official/1.100/examples/windows/delphitools/common/FindDlg.dfm new file mode 100644 index 0000000..ad3da51 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/FindDlg.dfm @@ -0,0 +1,107 @@ +object FindTextForm: TFindTextForm + Left = 305 + Top = 226 + ActiveControl = SearchTextEdit + BorderStyle = bsDialog + Caption = 'Find text' + ClientHeight = 110 + ClientWidth = 346 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + PixelsPerInch = 96 + TextHeight = 13 + object FindBtn: TButton + Left = 264 + Top = 8 + Width = 75 + Height = 25 + Caption = '&Find' + Default = True + TabOrder = 0 + OnClick = FindBtnClick + end + object CancelBtn: TButton + Left = 264 + Top = 40 + Width = 75 + Height = 25 + Cancel = True + Caption = '&Cancel' + ModalResult = 2 + TabOrder = 1 + end + object ProgressBar1: TProgressBar + Left = 8 + Top = 96 + Width = 329 + Height = 9 + Min = 0 + Max = 100 + Step = 20 + TabOrder = 2 + Visible = False + end + object GroupBox1: TGroupBox + Left = 8 + Top = 0 + Width = 249 + Height = 89 + TabOrder = 3 + object Label1: TLabel + Left = 8 + Top = 20 + Width = 56 + Height = 13 + Caption = '&Text to find:' + FocusControl = SearchTextEdit + end + object Label2: TLabel + Left = 8 + Top = 44 + Width = 38 + Height = 13 + Caption = 'C&olumn:' + FocusControl = ColumnComboBox + end + object SearchTextEdit: TEdit + Left = 72 + Top = 16 + Width = 169 + Height = 21 + TabOrder = 0 + end + object ColumnComboBox: TComboBox + Left = 72 + Top = 40 + Width = 169 + Height = 21 + Style = csDropDownList + ItemHeight = 13 + TabOrder = 1 + end + object CaseCheckBox: TCheckBox + Left = 72 + Top = 64 + Width = 81 + Height = 17 + Caption = '&Ignore case' + Checked = True + State = cbChecked + TabOrder = 2 + end + object ExactCheckBox: TCheckBox + Left = 160 + Top = 64 + Width = 81 + Height = 17 + Caption = '&Exact match' + TabOrder = 3 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/common/FindDlg.pas b/official/1.100/examples/windows/delphitools/common/FindDlg.pas new file mode 100644 index 0000000..2d97cb7 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/FindDlg.pas @@ -0,0 +1,202 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is D6MdiMsgFix.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit FindDlg; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ComCtrls; + +type + TFindTextForm = class(TForm) + FindBtn: TButton; + CancelBtn: TButton; + ProgressBar1: TProgressBar; + GroupBox1: TGroupBox; + Label1: TLabel; + SearchTextEdit: TEdit; + ColumnComboBox: TComboBox; + Label2: TLabel; + CaseCheckBox: TCheckBox; + ExactCheckBox: TCheckBox; + procedure FindBtnClick(Sender: TObject); + private + FListView: TListView; + procedure SetListView(const Value: TListView); + public + function Find: Boolean; + class function CanExecuteFind: Boolean; + property ListView: TListView read FListView write SetListView; + end; + +function ShowFindDialog(AListView: TListView): Boolean; + +var + FindTextForm: TFindTextForm; + +implementation + +{$R *.DFM} + +resourcestring + RsAllColumns = '[all columns]'; + +function ShowFindDialog(AListView: TListView): Boolean; +begin + with TFindTextForm.Create(Application) do + try + ListView := AListView; + Result := ShowModal = mrOk; + finally + Free; + end; +end; + +{ TFindForm } + +function TFindTextForm.Find: Boolean; +var + R, C, FindColumn, ColCount, FoundRow: Integer; + IgnoreCase, ExactMatch: Boolean; + SearchText: string; + + + function CompareColumnText(ColumnIndex: Integer): Boolean; + var + Text: string; + begin + with FListView.Items[R] do + if ColumnIndex = 0 then + Text := Caption + else + Text := SubItems[ColumnIndex - 1]; + if IgnoreCase then + Text := AnsiUpperCase(Text); + if ExactMatch then + Result := (SearchText = Text) + else + Result := (Pos(SearchText, Text) > 0); + if Result then + FoundRow := R; + end; + +begin + SearchTextEdit.Enabled := False; + ColumnComboBox.Enabled := False; + CaseCheckBox.Enabled := False; + ExactCheckBox.Enabled := False; + GroupBox1.Enabled := False; + FindBtn.Enabled := False; + CancelBtn.Enabled := False; + Update; + Result := False; + with FListView do + begin + if ItemFocused = nil then + begin + ItemFocused := Items[0]; + ItemFocused.MakeVisible(False); + end; + ProgressBar1.Max := Items.Count; + ProgressBar1.Min := ItemFocused.Index; + ProgressBar1.Position := ItemFocused.Index; + ProgressBar1.Visible := True; + FindColumn := ColumnComboBox.ItemIndex - 1; + ColCount := Columns.Count; + FoundRow := -1; + IgnoreCase := CaseCheckBox.Checked; + ExactMatch := ExactCheckBox.Checked; + if IgnoreCase then + SearchText := AnsiUpperCase(SearchTextEdit.Text) + else + SearchText := SearchTextEdit.Text; + for R := ItemFocused.Index + 1 to Items.Count - 1 do + begin + if FindColumn = -1 then + for C := 0 to ColCount - 1 do + CompareColumnText(C) + else + CompareColumnText(FindColumn); + if R mod ProgressBar1.Step = 0 then + ProgressBar1.StepIt; + if FoundRow > -1 then + begin + Result := True; + if Selected <> nil then + Selected.Selected := False; + ItemFocused := Items[FoundRow]; + Selected := ItemFocused; + ItemFocused.MakeVisible(False); + Break; + end; + end; + end; + SearchTextEdit.Enabled := True; + ColumnComboBox.Enabled := True; + CaseCheckBox.Enabled := True; + ExactCheckBox.Enabled := True; + GroupBox1.Enabled := True; + ProgressBar1.Visible := False; + FindBtn.Enabled := True; + CancelBtn.Enabled := True; + SearchTextEdit.SetFocus; +end; + +procedure TFindTextForm.SetListView(const Value: TListView); +var + I: Integer; +begin + FListView := Value; + ColumnComboBox.Items.BeginUpdate; + ColumnComboBox.Items.Clear; + ColumnComboBox.Items.Add(RsAllColumns); + for I := 0 to FListView.Columns.Count - 1 do + ColumnComboBox.Items.Add(FListView.Columns[I].Caption); + ColumnComboBox.Items.EndUpdate; + ColumnComboBox.ItemIndex := 0; +end; + +procedure TFindTextForm.FindBtnClick(Sender: TObject); +begin + Find; +end; + +class function TFindTextForm.CanExecuteFind: Boolean; +var + LV: TListView; +begin + Result := (Screen.Activecontrol is TListView); + if Result then + begin + LV := TListView(Screen.Activecontrol); + Result := (LV.Items.Count > 0) and not LV.HideSelection; + end; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/common/SHDocVw_TLB.pas b/official/1.100/examples/windows/delphitools/common/SHDocVw_TLB.pas new file mode 100644 index 0000000..c214a5f --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/SHDocVw_TLB.pas @@ -0,0 +1,1931 @@ +unit SHDocVw_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1658 $ +// File generated on 12.3.2002 14:05:12 from Type Library described below. + +// ************************************************************************ // +// Type Lib: C:\WINDOWS\SYSTEM\SHDOCVW.DLL (1) +// LIBID: {EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B} +// LCID: 0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\stdole2.tlb) +// (2) v4.0 StdVCL, (C:\WINDOWS\SYSTEM\stdvcl40.dll) +// Errors: +// Hint: Member 'Type' of 'IWebBrowser' changed to 'Type_' +// Hint: Parameter 'Type' of IWebBrowser.Type changed to 'Type_' +// Hint: Parameter 'Property' of DWebBrowserEvents.PropertyChange changed to 'Property_' +// Hint: Parameter 'Property' of IWebBrowserApp.PutProperty changed to 'Property_' +// Hint: Parameter 'Property' of IWebBrowserApp.GetProperty changed to 'Property_' +// Hint: Parameter 'Type' of IShellUIHelper.AddDesktopComponent changed to 'Type_' +// Hint: Parameter 'var' of IShellNameSpace.Expand changed to 'var_' +// ************************************************************************ // +{$I jcl.inc} +{$I windowsonly.inc} + +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +{$WRITEABLECONST ON} + +interface + +{$IFDEF DELPHI6_UP} + {$VARPROPSETTER ON} +{$ENDIF} + +uses + Windows, ActiveX, Classes, Graphics, OleCtrls, + {$IFDEF DELPHI5_UP} + OleServer, + {$ENDIF} + {$IFDEF DELPHI6_UP} + Variants, + {$ENDIF} + StdVCL; + + + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + SHDocVwMajorVersion = 1; + SHDocVwMinorVersion = 1; + + LIBID_SHDocVw: TGUID = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}'; + + IID_IWebBrowser: TGUID = '{EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B}'; + DIID_DWebBrowserEvents: TGUID = '{EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B}'; + IID_IWebBrowserApp: TGUID = '{0002DF05-0000-0000-C000-000000000046}'; + IID_IWebBrowser2: TGUID = '{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}'; + DIID_DWebBrowserEvents2: TGUID = '{34A715A0-6587-11D0-924A-0020AFC7AC4D}'; + CLASS_WebBrowser_V1: TGUID = '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}'; + CLASS_WebBrowser: TGUID = '{8856F961-340A-11D0-A96B-00C04FD705A2}'; + CLASS_InternetExplorer: TGUID = '{0002DF01-0000-0000-C000-000000000046}'; + CLASS_ShellBrowserWindow: TGUID = '{C08AFD90-F2A1-11D1-8455-00A0C91F3880}'; + DIID_DShellWindowsEvents: TGUID = '{FE4106E0-399A-11D0-A48C-00A0C90A8F39}'; + IID_IShellWindows: TGUID = '{85CB6900-4D95-11CF-960C-0080C7F4EE85}'; + CLASS_ShellWindows: TGUID = '{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'; + IID_IShellUIHelper: TGUID = '{729FE2F8-1EA8-11D1-8F85-00C04FC2FBE1}'; + CLASS_ShellUIHelper: TGUID = '{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}'; + DIID_DShellNameSpaceEvents: TGUID = '{55136806-B2DE-11D1-B9F2-00A0C98BC547}'; + IID_IShellFavoritesNameSpace: TGUID = '{55136804-B2DE-11D1-B9F2-00A0C98BC547}'; + IID_IShellNameSpace: TGUID = '{E572D3C9-37BE-4AE2-825D-D521763E3108}'; + CLASS_ShellNameSpace: TGUID = '{55136805-B2DE-11D1-B9F2-00A0C98BC547}'; + IID_IScriptErrorList: TGUID = '{F3470F24-15FD-11D2-BB2E-00805FF7EFCA}'; + CLASS_CScriptErrorList: TGUID = '{EFD01300-160F-11D2-BB2E-00805FF7EFCA}'; + IID_ISearch: TGUID = '{BA9239A4-3DD5-11D2-BF8B-00C04FB93661}'; + IID_ISearches: TGUID = '{47C922A2-3DD5-11D2-BF8B-00C04FB93661}'; + IID_ISearchAssistantOC: TGUID = '{72423E8F-8011-11D2-BE79-00A0C9A83DA1}'; + IID_ISearchAssistantOC2: TGUID = '{72423E8F-8011-11D2-BE79-00A0C9A83DA2}'; + DIID__SearchAssistantEvents: TGUID = '{1611FDDA-445B-11D2-85DE-00C04FA35C89}'; + CLASS_SearchAssistantOC: TGUID = '{B45FF030-4447-11D2-85DE-00C04FA35C89}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum CommandStateChangeConstants +type + CommandStateChangeConstants = TOleEnum; +const + CSC_UPDATECOMMANDS = $FFFFFFFF; + CSC_NAVIGATEFORWARD = $00000001; + CSC_NAVIGATEBACK = $00000002; + +// Constants for enum OLECMDID +type + OLECMDID = TOleEnum; +const + OLECMDID_OPEN = $00000001; + OLECMDID_NEW = $00000002; + OLECMDID_SAVE = $00000003; + OLECMDID_SAVEAS = $00000004; + OLECMDID_SAVECOPYAS = $00000005; + OLECMDID_PRINT = $00000006; + OLECMDID_PRINTPREVIEW = $00000007; + OLECMDID_PAGESETUP = $00000008; + OLECMDID_SPELL = $00000009; + OLECMDID_PROPERTIES = $0000000A; + OLECMDID_CUT = $0000000B; + OLECMDID_COPY = $0000000C; + OLECMDID_PASTE = $0000000D; + OLECMDID_PASTESPECIAL = $0000000E; + OLECMDID_UNDO = $0000000F; + OLECMDID_REDO = $00000010; + OLECMDID_SELECTALL = $00000011; + OLECMDID_CLEARSELECTION = $00000012; + OLECMDID_ZOOM = $00000013; + OLECMDID_GETZOOMRANGE = $00000014; + OLECMDID_UPDATECOMMANDS = $00000015; + OLECMDID_REFRESH = $00000016; + OLECMDID_STOP = $00000017; + OLECMDID_HIDETOOLBARS = $00000018; + OLECMDID_SETPROGRESSMAX = $00000019; + OLECMDID_SETPROGRESSPOS = $0000001A; + OLECMDID_SETPROGRESSTEXT = $0000001B; + OLECMDID_SETTITLE = $0000001C; + OLECMDID_SETDOWNLOADSTATE = $0000001D; + OLECMDID_STOPDOWNLOAD = $0000001E; + OLECMDID_ONTOOLBARACTIVATED = $0000001F; + OLECMDID_FIND = $00000020; + OLECMDID_DELETE = $00000021; + OLECMDID_HTTPEQUIV = $00000022; + OLECMDID_HTTPEQUIV_DONE = $00000023; + OLECMDID_ENABLE_INTERACTION = $00000024; + OLECMDID_ONUNLOAD = $00000025; + OLECMDID_PROPERTYBAG2 = $00000026; + OLECMDID_PREREFRESH = $00000027; + OLECMDID_SHOWSCRIPTERROR = $00000028; + OLECMDID_SHOWMESSAGE = $00000029; + OLECMDID_SHOWFIND = $0000002A; + OLECMDID_SHOWPAGESETUP = $0000002B; + OLECMDID_SHOWPRINT = $0000002C; + OLECMDID_CLOSE = $0000002D; + OLECMDID_ALLOWUILESSSAVEAS = $0000002E; + OLECMDID_DONTDOWNLOADCSS = $0000002F; + OLECMDID_UPDATEPAGESTATUS = $00000030; + +// Constants for enum OLECMDF +type + OLECMDF = TOleEnum; +const + OLECMDF_SUPPORTED = $00000001; + OLECMDF_ENABLED = $00000002; + OLECMDF_LATCHED = $00000004; + OLECMDF_NINCHED = $00000008; + OLECMDF_INVISIBLE = $00000010; + OLECMDF_DEFHIDEONCTXTMENU = $00000020; + +// Constants for enum OLECMDEXECOPT +type + OLECMDEXECOPT = TOleEnum; +const + OLECMDEXECOPT_DODEFAULT = $00000000; + OLECMDEXECOPT_PROMPTUSER = $00000001; + OLECMDEXECOPT_DONTPROMPTUSER = $00000002; + OLECMDEXECOPT_SHOWHELP = $00000003; + +// Constants for enum tagREADYSTATE +type + tagREADYSTATE = TOleEnum; +const + READYSTATE_UNINITIALIZED = $00000000; + READYSTATE_LOADING = $00000001; + READYSTATE_LOADED = $00000002; + READYSTATE_INTERACTIVE = $00000003; + READYSTATE_COMPLETE = $00000004; + +// Constants for enum SecureLockIconConstants +type + SecureLockIconConstants = TOleEnum; +const + secureLockIconUnsecure = $00000000; + secureLockIconMixed = $00000001; + secureLockIconSecureUnknownBits = $00000002; + secureLockIconSecure40Bit = $00000003; + secureLockIconSecure56Bit = $00000004; + secureLockIconSecureFortezza = $00000005; + secureLockIconSecure128Bit = $00000006; + +// Constants for enum ShellWindowTypeConstants +type + ShellWindowTypeConstants = TOleEnum; +const + SWC_EXPLORER = $00000000; + SWC_BROWSER = $00000001; + SWC_3RDPARTY = $00000002; + SWC_CALLBACK = $00000004; + +// Constants for enum ShellWindowFindWindowOptions +type + ShellWindowFindWindowOptions = TOleEnum; +const + SWFO_NEEDDISPATCH = $00000001; + SWFO_INCLUDEPENDING = $00000002; + SWFO_COOKIEPASSED = $00000004; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IWebBrowser = interface; + IWebBrowserDisp = dispinterface; + DWebBrowserEvents = dispinterface; + IWebBrowserApp = interface; + IWebBrowserAppDisp = dispinterface; + IWebBrowser2 = interface; + IWebBrowser2Disp = dispinterface; + DWebBrowserEvents2 = dispinterface; + DShellWindowsEvents = dispinterface; + IShellWindows = interface; + IShellWindowsDisp = dispinterface; + IShellUIHelper = interface; + IShellUIHelperDisp = dispinterface; + DShellNameSpaceEvents = dispinterface; + IShellFavoritesNameSpace = interface; + IShellFavoritesNameSpaceDisp = dispinterface; + IShellNameSpace = interface; + IShellNameSpaceDisp = dispinterface; + IScriptErrorList = interface; + IScriptErrorListDisp = dispinterface; + ISearch = interface; + ISearchDisp = dispinterface; + ISearches = interface; + ISearchesDisp = dispinterface; + ISearchAssistantOC = interface; + ISearchAssistantOCDisp = dispinterface; + ISearchAssistantOC2 = interface; + ISearchAssistantOC2Disp = dispinterface; + _SearchAssistantEvents = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + WebBrowser_V1 = IWebBrowser; + WebBrowser = IWebBrowser2; + InternetExplorer = IWebBrowser2; + ShellBrowserWindow = IWebBrowser2; + ShellWindows = IShellWindows; + ShellUIHelper = IShellUIHelper; + ShellNameSpace = IShellNameSpace; + CScriptErrorList = IScriptErrorList; + SearchAssistantOC = ISearchAssistantOC2; + + +// *********************************************************************// +// Declaration of structures, unions and aliases. +// *********************************************************************// + POleVariant1 = ^OleVariant; {*} + + +// *********************************************************************// +// Interface: IWebBrowser +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B} +// *********************************************************************// + IWebBrowser = interface(IDispatch) + ['{EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B}'] + procedure GoBack; safecall; + procedure GoForward; safecall; + procedure GoHome; safecall; + procedure GoSearch; safecall; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); safecall; + procedure Refresh; safecall; + procedure Refresh2(var Level: OleVariant); safecall; + procedure Stop; safecall; + function Get_Application: IDispatch; safecall; + function Get_Parent: IDispatch; safecall; + function Get_Container: IDispatch; safecall; + function Get_Document: IDispatch; safecall; + function Get_TopLevelContainer: WordBool; safecall; + function Get_Type_: WideString; safecall; + function Get_Left: Integer; safecall; + procedure Set_Left(pl: Integer); safecall; + function Get_Top: Integer; safecall; + procedure Set_Top(pl: Integer); safecall; + function Get_Width: Integer; safecall; + procedure Set_Width(pl: Integer); safecall; + function Get_Height: Integer; safecall; + procedure Set_Height(pl: Integer); safecall; + function Get_LocationName: WideString; safecall; + function Get_LocationURL: WideString; safecall; + function Get_Busy: WordBool; safecall; + property Application: IDispatch read Get_Application; + property Parent: IDispatch read Get_Parent; + property Container: IDispatch read Get_Container; + property Document: IDispatch read Get_Document; + property TopLevelContainer: WordBool read Get_TopLevelContainer; + property Type_: WideString read Get_Type_; + property Left: Integer read Get_Left write Set_Left; + property Top: Integer read Get_Top write Set_Top; + property Width: Integer read Get_Width write Set_Width; + property Height: Integer read Get_Height write Set_Height; + property LocationName: WideString read Get_LocationName; + property LocationURL: WideString read Get_LocationURL; + property Busy: WordBool read Get_Busy; + end; + +// *********************************************************************// +// DispIntf: IWebBrowserDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B} +// *********************************************************************// + IWebBrowserDisp = dispinterface + ['{EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B}'] + procedure GoBack; dispid 100; + procedure GoForward; dispid 101; + procedure GoHome; dispid 102; + procedure GoSearch; dispid 103; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); dispid 104; + procedure Refresh; dispid -550; + procedure Refresh2(var Level: OleVariant); dispid 105; + procedure Stop; dispid 106; + property Application: IDispatch readonly dispid 200; + property Parent: IDispatch readonly dispid 201; + property Container: IDispatch readonly dispid 202; + property Document: IDispatch readonly dispid 203; + property TopLevelContainer: WordBool readonly dispid 204; + property Type_: WideString readonly dispid 205; + property Left: Integer dispid 206; + property Top: Integer dispid 207; + property Width: Integer dispid 208; + property Height: Integer dispid 209; + property LocationName: WideString readonly dispid 210; + property LocationURL: WideString readonly dispid 211; + property Busy: WordBool readonly dispid 212; + end; + +// *********************************************************************// +// DispIntf: DWebBrowserEvents +// Flags: (4112) Hidden Dispatchable +// GUID: {EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B} +// *********************************************************************// + DWebBrowserEvents = dispinterface + ['{EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B}'] + procedure BeforeNavigate(const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; var PostData: OleVariant; + const Headers: WideString; var Cancel: WordBool); dispid 100; + procedure NavigateComplete(const URL: WideString); dispid 101; + procedure StatusTextChange(const Text: WideString); dispid 102; + procedure ProgressChange(Progress: Integer; ProgressMax: Integer); dispid 108; + procedure DownloadComplete; dispid 104; + procedure CommandStateChange(Command: Integer; Enable: WordBool); dispid 105; + procedure DownloadBegin; dispid 106; + procedure NewWindow(const URL: WideString; Flags: Integer; const TargetFrameName: WideString; + var PostData: OleVariant; const Headers: WideString; var Processed: WordBool); dispid 107; + procedure TitleChange(const Text: WideString); dispid 113; + procedure FrameBeforeNavigate(const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; var PostData: OleVariant; + const Headers: WideString; var Cancel: WordBool); dispid 200; + procedure FrameNavigateComplete(const URL: WideString); dispid 201; + procedure FrameNewWindow(const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; var PostData: OleVariant; + const Headers: WideString; var Processed: WordBool); dispid 204; + procedure Quit(var Cancel: WordBool); dispid 103; + procedure WindowMove; dispid 109; + procedure WindowResize; dispid 110; + procedure WindowActivate; dispid 111; + procedure PropertyChange(const Property_: WideString); dispid 112; + end; + +// *********************************************************************// +// Interface: IWebBrowserApp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {0002DF05-0000-0000-C000-000000000046} +// *********************************************************************// + IWebBrowserApp = interface(IWebBrowser) + ['{0002DF05-0000-0000-C000-000000000046}'] + procedure Quit; safecall; + procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); safecall; + procedure PutProperty(const Property_: WideString; vtValue: OleVariant); safecall; + function GetProperty(const Property_: WideString): OleVariant; safecall; + function Get_Name: WideString; safecall; + function Get_HWND: Integer; safecall; + function Get_FullName: WideString; safecall; + function Get_Path: WideString; safecall; + function Get_Visible: WordBool; safecall; + procedure Set_Visible(pBool: WordBool); safecall; + function Get_StatusBar: WordBool; safecall; + procedure Set_StatusBar(pBool: WordBool); safecall; + function Get_StatusText: WideString; safecall; + procedure Set_StatusText(const StatusText: WideString); safecall; + function Get_ToolBar: SYSINT; safecall; + procedure Set_ToolBar(Value: SYSINT); safecall; + function Get_MenuBar: WordBool; safecall; + procedure Set_MenuBar(Value: WordBool); safecall; + function Get_FullScreen: WordBool; safecall; + procedure Set_FullScreen(pbFullScreen: WordBool); safecall; + property Name: WideString read Get_Name; + property HWND: Integer read Get_HWND; + property FullName: WideString read Get_FullName; + property Path: WideString read Get_Path; + property Visible: WordBool read Get_Visible write Set_Visible; + property StatusBar: WordBool read Get_StatusBar write Set_StatusBar; + property StatusText: WideString read Get_StatusText write Set_StatusText; + property ToolBar: SYSINT read Get_ToolBar write Set_ToolBar; + property MenuBar: WordBool read Get_MenuBar write Set_MenuBar; + property FullScreen: WordBool read Get_FullScreen write Set_FullScreen; + end; + +// *********************************************************************// +// DispIntf: IWebBrowserAppDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {0002DF05-0000-0000-C000-000000000046} +// *********************************************************************// + IWebBrowserAppDisp = dispinterface + ['{0002DF05-0000-0000-C000-000000000046}'] + procedure Quit; dispid 300; + procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); dispid 301; + procedure PutProperty(const Property_: WideString; vtValue: OleVariant); dispid 302; + function GetProperty(const Property_: WideString): OleVariant; dispid 303; + property Name: WideString readonly dispid 0; + property HWND: Integer readonly dispid -515; + property FullName: WideString readonly dispid 400; + property Path: WideString readonly dispid 401; + property Visible: WordBool dispid 402; + property StatusBar: WordBool dispid 403; + property StatusText: WideString dispid 404; + property ToolBar: SYSINT dispid 405; + property MenuBar: WordBool dispid 406; + property FullScreen: WordBool dispid 407; + procedure GoBack; dispid 100; + procedure GoForward; dispid 101; + procedure GoHome; dispid 102; + procedure GoSearch; dispid 103; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); dispid 104; + procedure Refresh; dispid -550; + procedure Refresh2(var Level: OleVariant); dispid 105; + procedure Stop; dispid 106; + property Application: IDispatch readonly dispid 200; + property Parent: IDispatch readonly dispid 201; + property Container: IDispatch readonly dispid 202; + property Document: IDispatch readonly dispid 203; + property TopLevelContainer: WordBool readonly dispid 204; + property Type_: WideString readonly dispid 205; + property Left: Integer dispid 206; + property Top: Integer dispid 207; + property Width: Integer dispid 208; + property Height: Integer dispid 209; + property LocationName: WideString readonly dispid 210; + property LocationURL: WideString readonly dispid 211; + property Busy: WordBool readonly dispid 212; + end; + +// *********************************************************************// +// Interface: IWebBrowser2 +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {D30C1661-CDAF-11D0-8A3E-00C04FC9E26E} +// *********************************************************************// + IWebBrowser2 = interface(IWebBrowserApp) + ['{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}'] + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); safecall; + function QueryStatusWB(cmdID: OLECMDID): OLECMDF; safecall; + procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; + var pvaOut: OleVariant); safecall; + procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant; + var pvarSize: OleVariant); safecall; + function Get_ReadyState: tagREADYSTATE; safecall; + function Get_Offline: WordBool; safecall; + procedure Set_Offline(pbOffline: WordBool); safecall; + function Get_Silent: WordBool; safecall; + procedure Set_Silent(pbSilent: WordBool); safecall; + function Get_RegisterAsBrowser: WordBool; safecall; + procedure Set_RegisterAsBrowser(pbRegister: WordBool); safecall; + function Get_RegisterAsDropTarget: WordBool; safecall; + procedure Set_RegisterAsDropTarget(pbRegister: WordBool); safecall; + function Get_TheaterMode: WordBool; safecall; + procedure Set_TheaterMode(pbRegister: WordBool); safecall; + function Get_AddressBar: WordBool; safecall; + procedure Set_AddressBar(Value: WordBool); safecall; + function Get_Resizable: WordBool; safecall; + procedure Set_Resizable(Value: WordBool); safecall; + property ReadyState: tagREADYSTATE read Get_ReadyState; + property Offline: WordBool read Get_Offline write Set_Offline; + property Silent: WordBool read Get_Silent write Set_Silent; + property RegisterAsBrowser: WordBool read Get_RegisterAsBrowser write Set_RegisterAsBrowser; + property RegisterAsDropTarget: WordBool read Get_RegisterAsDropTarget write Set_RegisterAsDropTarget; + property TheaterMode: WordBool read Get_TheaterMode write Set_TheaterMode; + property AddressBar: WordBool read Get_AddressBar write Set_AddressBar; + property Resizable: WordBool read Get_Resizable write Set_Resizable; + end; + +// *********************************************************************// +// DispIntf: IWebBrowser2Disp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {D30C1661-CDAF-11D0-8A3E-00C04FC9E26E} +// *********************************************************************// + IWebBrowser2Disp = dispinterface + ['{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}'] + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); dispid 500; + function QueryStatusWB(cmdID: OLECMDID): OLECMDF; dispid 501; + procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; + var pvaOut: OleVariant); dispid 502; + procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant; + var pvarSize: OleVariant); dispid 503; + property ReadyState: tagREADYSTATE readonly dispid -525; + property Offline: WordBool dispid 550; + property Silent: WordBool dispid 551; + property RegisterAsBrowser: WordBool dispid 552; + property RegisterAsDropTarget: WordBool dispid 553; + property TheaterMode: WordBool dispid 554; + property AddressBar: WordBool dispid 555; + property Resizable: WordBool dispid 556; + procedure Quit; dispid 300; + procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); dispid 301; + procedure PutProperty(const Property_: WideString; vtValue: OleVariant); dispid 302; + function GetProperty(const Property_: WideString): OleVariant; dispid 303; + property Name: WideString readonly dispid 0; + property HWND: Integer readonly dispid -515; + property FullName: WideString readonly dispid 400; + property Path: WideString readonly dispid 401; + property Visible: WordBool dispid 402; + property StatusBar: WordBool dispid 403; + property StatusText: WideString dispid 404; + property ToolBar: SYSINT dispid 405; + property MenuBar: WordBool dispid 406; + property FullScreen: WordBool dispid 407; + procedure GoBack; dispid 100; + procedure GoForward; dispid 101; + procedure GoHome; dispid 102; + procedure GoSearch; dispid 103; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); dispid 104; + procedure Refresh; dispid -550; + procedure Refresh2(var Level: OleVariant); dispid 105; + procedure Stop; dispid 106; + property Application: IDispatch readonly dispid 200; + property Parent: IDispatch readonly dispid 201; + property Container: IDispatch readonly dispid 202; + property Document: IDispatch readonly dispid 203; + property TopLevelContainer: WordBool readonly dispid 204; + property Type_: WideString readonly dispid 205; + property Left: Integer dispid 206; + property Top: Integer dispid 207; + property Width: Integer dispid 208; + property Height: Integer dispid 209; + property LocationName: WideString readonly dispid 210; + property LocationURL: WideString readonly dispid 211; + property Busy: WordBool readonly dispid 212; + end; + +// *********************************************************************// +// DispIntf: DWebBrowserEvents2 +// Flags: (4112) Hidden Dispatchable +// GUID: {34A715A0-6587-11D0-924A-0020AFC7AC4D} +// *********************************************************************// + DWebBrowserEvents2 = dispinterface + ['{34A715A0-6587-11D0-924A-0020AFC7AC4D}'] + procedure StatusTextChange(const Text: WideString); dispid 102; + procedure ProgressChange(Progress: Integer; ProgressMax: Integer); dispid 108; + procedure CommandStateChange(Command: Integer; Enable: WordBool); dispid 105; + procedure DownloadBegin; dispid 106; + procedure DownloadComplete; dispid 104; + procedure TitleChange(const Text: WideString); dispid 113; + procedure PropertyChange(const szProperty: WideString); dispid 112; + procedure BeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant; var Cancel: WordBool); dispid 250; + procedure NewWindow2(var ppDisp: IDispatch; var Cancel: WordBool); dispid 251; + procedure NavigateComplete2(const pDisp: IDispatch; var URL: OleVariant); dispid 252; + procedure DocumentComplete(const pDisp: IDispatch; var URL: OleVariant); dispid 259; + procedure OnQuit; dispid 253; + procedure OnVisible(Visible: WordBool); dispid 254; + procedure OnToolBar(ToolBar: WordBool); dispid 255; + procedure OnMenuBar(MenuBar: WordBool); dispid 256; + procedure OnStatusBar(StatusBar: WordBool); dispid 257; + procedure OnFullScreen(FullScreen: WordBool); dispid 258; + procedure OnTheaterMode(TheaterMode: WordBool); dispid 260; + procedure WindowSetResizable(Resizable: WordBool); dispid 262; + procedure WindowSetLeft(Left: Integer); dispid 264; + procedure WindowSetTop(Top: Integer); dispid 265; + procedure WindowSetWidth(Width: Integer); dispid 266; + procedure WindowSetHeight(Height: Integer); dispid 267; + procedure WindowClosing(IsChildWindow: WordBool; var Cancel: WordBool); dispid 263; + procedure ClientToHostWindow(var CX: Integer; var CY: Integer); dispid 268; + procedure SetSecureLockIcon(SecureLockIcon: Integer); dispid 269; + procedure FileDownload(var Cancel: WordBool); dispid 270; + end; + +// *********************************************************************// +// DispIntf: DShellWindowsEvents +// Flags: (4096) Dispatchable +// GUID: {FE4106E0-399A-11D0-A48C-00A0C90A8F39} +// *********************************************************************// + DShellWindowsEvents = dispinterface + ['{FE4106E0-399A-11D0-A48C-00A0C90A8F39}'] + procedure WindowRegistered(lCookie: Integer); dispid 200; + procedure WindowRevoked(lCookie: Integer); dispid 201; + end; + +// *********************************************************************// +// Interface: IShellWindows +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {85CB6900-4D95-11CF-960C-0080C7F4EE85} +// *********************************************************************// + IShellWindows = interface(IDispatch) + ['{85CB6900-4D95-11CF-960C-0080C7F4EE85}'] + function Get_Count: Integer; safecall; + function Item(index: OleVariant): IDispatch; safecall; + function _NewEnum: IUnknown; safecall; + procedure Register(const pid: IDispatch; HWND: Integer; swClass: SYSINT; out plCookie: Integer); safecall; + procedure RegisterPending(lThreadId: Integer; var pvarloc: OleVariant; + var pvarlocRoot: OleVariant; swClass: SYSINT; out plCookie: Integer); safecall; + procedure Revoke(lCookie: Integer); safecall; + procedure OnNavigate(lCookie: Integer; var pvarloc: OleVariant); safecall; + procedure OnActivated(lCookie: Integer; fActive: WordBool); safecall; + function FindWindowSW(var pvarloc: OleVariant; var pvarlocRoot: OleVariant; swClass: SYSINT; + out pHWND: Integer; swfwOptions: SYSINT): IDispatch; safecall; + procedure OnCreated(lCookie: Integer; const punk: IUnknown); safecall; + procedure ProcessAttachDetach(fAttach: WordBool); safecall; + property Count: Integer read Get_Count; + end; + +// *********************************************************************// +// DispIntf: IShellWindowsDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {85CB6900-4D95-11CF-960C-0080C7F4EE85} +// *********************************************************************// + IShellWindowsDisp = dispinterface + ['{85CB6900-4D95-11CF-960C-0080C7F4EE85}'] + property Count: Integer readonly dispid 1610743808; + function Item(index: OleVariant): IDispatch; dispid 0; + function _NewEnum: IUnknown; dispid -4; + procedure Register(const pid: IDispatch; HWND: Integer; swClass: SYSINT; out plCookie: Integer); dispid 1610743811; + procedure RegisterPending(lThreadId: Integer; var pvarloc: OleVariant; + var pvarlocRoot: OleVariant; swClass: SYSINT; out plCookie: Integer); dispid 1610743812; + procedure Revoke(lCookie: Integer); dispid 1610743813; + procedure OnNavigate(lCookie: Integer; var pvarloc: OleVariant); dispid 1610743814; + procedure OnActivated(lCookie: Integer; fActive: WordBool); dispid 1610743815; + function FindWindowSW(var pvarloc: OleVariant; var pvarlocRoot: OleVariant; swClass: SYSINT; + out pHWND: Integer; swfwOptions: SYSINT): IDispatch; dispid 1610743816; + procedure OnCreated(lCookie: Integer; const punk: IUnknown); dispid 1610743817; + procedure ProcessAttachDetach(fAttach: WordBool); dispid 1610743818; + end; + +// *********************************************************************// +// Interface: IShellUIHelper +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {729FE2F8-1EA8-11D1-8F85-00C04FC2FBE1} +// *********************************************************************// + IShellUIHelper = interface(IDispatch) + ['{729FE2F8-1EA8-11D1-8F85-00C04FC2FBE1}'] + procedure ResetFirstBootMode; safecall; + procedure ResetSafeMode; safecall; + procedure RefreshOfflineDesktop; safecall; + procedure AddFavorite(const URL: WideString; var Title: OleVariant); safecall; + procedure AddChannel(const URL: WideString); safecall; + procedure AddDesktopComponent(const URL: WideString; const Type_: WideString; + var Left: OleVariant; var Top: OleVariant; var Width: OleVariant; + var Height: OleVariant); safecall; + function IsSubscribed(const URL: WideString): WordBool; safecall; + procedure NavigateAndFind(const URL: WideString; const strQuery: WideString; + var varTargetFrame: OleVariant); safecall; + procedure ImportExportFavorites(fImport: WordBool; const strImpExpPath: WideString); safecall; + procedure AutoCompleteSaveForm(var Form: OleVariant); safecall; + procedure AutoScan(const strSearch: WideString; const strFailureUrl: WideString; + var pvarTargetFrame: OleVariant); safecall; + procedure AutoCompleteAttach(var Reserved: OleVariant); safecall; + function ShowBrowserUI(const bstrName: WideString; var pvarIn: OleVariant): OleVariant; safecall; + end; + +// *********************************************************************// +// DispIntf: IShellUIHelperDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {729FE2F8-1EA8-11D1-8F85-00C04FC2FBE1} +// *********************************************************************// + IShellUIHelperDisp = dispinterface + ['{729FE2F8-1EA8-11D1-8F85-00C04FC2FBE1}'] + procedure ResetFirstBootMode; dispid 1; + procedure ResetSafeMode; dispid 2; + procedure RefreshOfflineDesktop; dispid 3; + procedure AddFavorite(const URL: WideString; var Title: OleVariant); dispid 4; + procedure AddChannel(const URL: WideString); dispid 5; + procedure AddDesktopComponent(const URL: WideString; const Type_: WideString; + var Left: OleVariant; var Top: OleVariant; var Width: OleVariant; + var Height: OleVariant); dispid 6; + function IsSubscribed(const URL: WideString): WordBool; dispid 7; + procedure NavigateAndFind(const URL: WideString; const strQuery: WideString; + var varTargetFrame: OleVariant); dispid 8; + procedure ImportExportFavorites(fImport: WordBool; const strImpExpPath: WideString); dispid 9; + procedure AutoCompleteSaveForm(var Form: OleVariant); dispid 10; + procedure AutoScan(const strSearch: WideString; const strFailureUrl: WideString; + var pvarTargetFrame: OleVariant); dispid 11; + procedure AutoCompleteAttach(var Reserved: OleVariant); dispid 12; + function ShowBrowserUI(const bstrName: WideString; var pvarIn: OleVariant): OleVariant; dispid 13; + end; + +// *********************************************************************// +// DispIntf: DShellNameSpaceEvents +// Flags: (4096) Dispatchable +// GUID: {55136806-B2DE-11D1-B9F2-00A0C98BC547} +// *********************************************************************// + DShellNameSpaceEvents = dispinterface + ['{55136806-B2DE-11D1-B9F2-00A0C98BC547}'] + procedure FavoritesSelectionChange(cItems: Integer; hItem: Integer; const strName: WideString; + const strUrl: WideString; cVisits: Integer; + const strDate: WideString; fAvailableOffline: Integer); dispid 1; + procedure SelectionChange; dispid 2; + procedure DoubleClick; dispid 3; + procedure Initialized; dispid 4; + end; + +// *********************************************************************// +// Interface: IShellFavoritesNameSpace +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {55136804-B2DE-11D1-B9F2-00A0C98BC547} +// *********************************************************************// + IShellFavoritesNameSpace = interface(IDispatch) + ['{55136804-B2DE-11D1-B9F2-00A0C98BC547}'] + procedure MoveSelectionUp; safecall; + procedure MoveSelectionDown; safecall; + procedure ResetSort; safecall; + procedure NewFolder; safecall; + procedure Synchronize; safecall; + procedure Import; safecall; + procedure Export; safecall; + procedure InvokeContextMenuCommand(const strCommand: WideString); safecall; + procedure MoveSelectionTo; safecall; + function Get_SubscriptionsEnabled: WordBool; safecall; + function CreateSubscriptionForSelection: WordBool; safecall; + function DeleteSubscriptionForSelection: WordBool; safecall; + procedure SetRoot(const bstrFullPath: WideString); safecall; + property SubscriptionsEnabled: WordBool read Get_SubscriptionsEnabled; + end; + +// *********************************************************************// +// DispIntf: IShellFavoritesNameSpaceDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {55136804-B2DE-11D1-B9F2-00A0C98BC547} +// *********************************************************************// + IShellFavoritesNameSpaceDisp = dispinterface + ['{55136804-B2DE-11D1-B9F2-00A0C98BC547}'] + procedure MoveSelectionUp; dispid 1; + procedure MoveSelectionDown; dispid 2; + procedure ResetSort; dispid 3; + procedure NewFolder; dispid 4; + procedure Synchronize; dispid 5; + procedure Import; dispid 6; + procedure Export; dispid 7; + procedure InvokeContextMenuCommand(const strCommand: WideString); dispid 8; + procedure MoveSelectionTo; dispid 9; + property SubscriptionsEnabled: WordBool readonly dispid 10; + function CreateSubscriptionForSelection: WordBool; dispid 11; + function DeleteSubscriptionForSelection: WordBool; dispid 12; + procedure SetRoot(const bstrFullPath: WideString); dispid 13; + end; + +// *********************************************************************// +// Interface: IShellNameSpace +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {E572D3C9-37BE-4AE2-825D-D521763E3108} +// *********************************************************************// + IShellNameSpace = interface(IShellFavoritesNameSpace) + ['{E572D3C9-37BE-4AE2-825D-D521763E3108}'] + function Get_EnumOptions: Integer; safecall; + procedure Set_EnumOptions(pgrfEnumFlags: Integer); safecall; + function Get_SelectedItem: IDispatch; safecall; + procedure Set_SelectedItem(const pItem: IDispatch); safecall; + function Get_Root: OleVariant; safecall; + procedure Set_Root(pvar: OleVariant); safecall; + function Get_Depth: SYSINT; safecall; + procedure Set_Depth(piDepth: SYSINT); safecall; + function Get_Mode: SYSUINT; safecall; + procedure Set_Mode(puMode: SYSUINT); safecall; + function Get_Flags: LongWord; safecall; + procedure Set_Flags(pdwFlags: LongWord); safecall; + procedure Set_TVFlags(dwFlags: LongWord); safecall; + function Get_TVFlags: LongWord; safecall; + function Get_Columns: WideString; safecall; + procedure Set_Columns(const bstrColumns: WideString); safecall; + function Get_CountViewTypes: SYSINT; safecall; + procedure SetViewType(iType: SYSINT); safecall; + function SelectedItems: IDispatch; safecall; + procedure Expand(var_: OleVariant; iDepth: SYSINT); safecall; + procedure UnselectAll; safecall; + property EnumOptions: Integer read Get_EnumOptions write Set_EnumOptions; + property SelectedItem: IDispatch read Get_SelectedItem write Set_SelectedItem; + property Root: OleVariant read Get_Root write Set_Root; + property Depth: SYSINT read Get_Depth write Set_Depth; + property Mode: SYSUINT read Get_Mode write Set_Mode; + property Flags: LongWord read Get_Flags write Set_Flags; + property TVFlags: LongWord read Get_TVFlags write Set_TVFlags; + property Columns: WideString read Get_Columns write Set_Columns; + property CountViewTypes: SYSINT read Get_CountViewTypes; + end; + +// *********************************************************************// +// DispIntf: IShellNameSpaceDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {E572D3C9-37BE-4AE2-825D-D521763E3108} +// *********************************************************************// + IShellNameSpaceDisp = dispinterface + ['{E572D3C9-37BE-4AE2-825D-D521763E3108}'] + property EnumOptions: Integer dispid 14; + property SelectedItem: IDispatch dispid 15; + property Root: OleVariant dispid 16; + property Depth: SYSINT dispid 17; + property Mode: SYSUINT dispid 18; + property Flags: LongWord dispid 19; + property TVFlags: LongWord dispid 20; + property Columns: WideString dispid 21; + property CountViewTypes: SYSINT readonly dispid 22; + procedure SetViewType(iType: SYSINT); dispid 23; + function SelectedItems: IDispatch; dispid 24; + procedure Expand(var_: OleVariant; iDepth: SYSINT); dispid 25; + procedure UnselectAll; dispid 26; + procedure MoveSelectionUp; dispid 1; + procedure MoveSelectionDown; dispid 2; + procedure ResetSort; dispid 3; + procedure NewFolder; dispid 4; + procedure Synchronize; dispid 5; + procedure Import; dispid 6; + procedure Export; dispid 7; + procedure InvokeContextMenuCommand(const strCommand: WideString); dispid 8; + procedure MoveSelectionTo; dispid 9; + property SubscriptionsEnabled: WordBool readonly dispid 10; + function CreateSubscriptionForSelection: WordBool; dispid 11; + function DeleteSubscriptionForSelection: WordBool; dispid 12; + procedure SetRoot(const bstrFullPath: WideString); dispid 13; + end; + +// *********************************************************************// +// Interface: IScriptErrorList +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {F3470F24-15FD-11D2-BB2E-00805FF7EFCA} +// *********************************************************************// + IScriptErrorList = interface(IDispatch) + ['{F3470F24-15FD-11D2-BB2E-00805FF7EFCA}'] + procedure advanceError; safecall; + procedure retreatError; safecall; + function canAdvanceError: Integer; safecall; + function canRetreatError: Integer; safecall; + function getErrorLine: Integer; safecall; + function getErrorChar: Integer; safecall; + function getErrorCode: Integer; safecall; + function getErrorMsg: WideString; safecall; + function getErrorUrl: WideString; safecall; + function getAlwaysShowLockState: Integer; safecall; + function getDetailsPaneOpen: Integer; safecall; + procedure setDetailsPaneOpen(fDetailsPaneOpen: Integer); safecall; + function getPerErrorDisplay: Integer; safecall; + procedure setPerErrorDisplay(fPerErrorDisplay: Integer); safecall; + end; + +// *********************************************************************// +// DispIntf: IScriptErrorListDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {F3470F24-15FD-11D2-BB2E-00805FF7EFCA} +// *********************************************************************// + IScriptErrorListDisp = dispinterface + ['{F3470F24-15FD-11D2-BB2E-00805FF7EFCA}'] + procedure advanceError; dispid 10; + procedure retreatError; dispid 11; + function canAdvanceError: Integer; dispid 12; + function canRetreatError: Integer; dispid 13; + function getErrorLine: Integer; dispid 14; + function getErrorChar: Integer; dispid 15; + function getErrorCode: Integer; dispid 16; + function getErrorMsg: WideString; dispid 17; + function getErrorUrl: WideString; dispid 18; + function getAlwaysShowLockState: Integer; dispid 23; + function getDetailsPaneOpen: Integer; dispid 19; + procedure setDetailsPaneOpen(fDetailsPaneOpen: Integer); dispid 20; + function getPerErrorDisplay: Integer; dispid 21; + procedure setPerErrorDisplay(fPerErrorDisplay: Integer); dispid 22; + end; + +// *********************************************************************// +// Interface: ISearch +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {BA9239A4-3DD5-11D2-BF8B-00C04FB93661} +// *********************************************************************// + ISearch = interface(IDispatch) + ['{BA9239A4-3DD5-11D2-BF8B-00C04FB93661}'] + function Get_Title: WideString; safecall; + function Get_Id: WideString; safecall; + function Get_URL: WideString; safecall; + property Title: WideString read Get_Title; + property Id: WideString read Get_Id; + property URL: WideString read Get_URL; + end; + +// *********************************************************************// +// DispIntf: ISearchDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {BA9239A4-3DD5-11D2-BF8B-00C04FB93661} +// *********************************************************************// + ISearchDisp = dispinterface + ['{BA9239A4-3DD5-11D2-BF8B-00C04FB93661}'] + property Title: WideString readonly dispid 1610743808; + property Id: WideString readonly dispid 1610743809; + property URL: WideString readonly dispid 1610743810; + end; + +// *********************************************************************// +// Interface: ISearches +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {47C922A2-3DD5-11D2-BF8B-00C04FB93661} +// *********************************************************************// + ISearches = interface(IDispatch) + ['{47C922A2-3DD5-11D2-BF8B-00C04FB93661}'] + function Get_Count: Integer; safecall; + function Get_Default: WideString; safecall; + function Item(index: OleVariant): ISearch; safecall; + function _NewEnum: IUnknown; safecall; + property Count: Integer read Get_Count; + property Default: WideString read Get_Default; + end; + +// *********************************************************************// +// DispIntf: ISearchesDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {47C922A2-3DD5-11D2-BF8B-00C04FB93661} +// *********************************************************************// + ISearchesDisp = dispinterface + ['{47C922A2-3DD5-11D2-BF8B-00C04FB93661}'] + property Count: Integer readonly dispid 1610743808; + property Default: WideString readonly dispid 1610743809; + function Item(index: OleVariant): ISearch; dispid 1610743810; + function _NewEnum: IUnknown; dispid -4; + end; + +// *********************************************************************// +// Interface: ISearchAssistantOC +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {72423E8F-8011-11D2-BE79-00A0C9A83DA1} +// *********************************************************************// + ISearchAssistantOC = interface(IDispatch) + ['{72423E8F-8011-11D2-BE79-00A0C9A83DA1}'] + procedure AddNextMenuItem(const bstrText: WideString; idItem: Integer); safecall; + procedure SetDefaultSearchUrl(const bstrUrl: WideString); safecall; + procedure NavigateToDefaultSearch; safecall; + function IsRestricted(const bstrGuid: WideString): WordBool; safecall; + function Get_ShellFeaturesEnabled: WordBool; safecall; + function Get_SearchAssistantDefault: WordBool; safecall; + function Get_Searches: ISearches; safecall; + function Get_InWebFolder: WordBool; safecall; + procedure PutProperty(bPerLocale: WordBool; const bstrName: WideString; + const bstrValue: WideString); safecall; + function GetProperty(bPerLocale: WordBool; const bstrName: WideString): WideString; safecall; + procedure Set_EventHandled(Param1: WordBool); safecall; + procedure ResetNextMenu; safecall; + procedure FindOnWeb; safecall; + procedure FindFilesOrFolders; safecall; + procedure FindComputer; safecall; + procedure FindPrinter; safecall; + procedure FindPeople; safecall; + function GetSearchAssistantURL(bSubstitute: WordBool; bCustomize: WordBool): WideString; safecall; + procedure NotifySearchSettingsChanged; safecall; + procedure Set_ASProvider(const pProvider: WideString); safecall; + function Get_ASProvider: WideString; safecall; + procedure Set_ASSetting(pSetting: SYSINT); safecall; + function Get_ASSetting: SYSINT; safecall; + procedure NETDetectNextNavigate; safecall; + procedure PutFindText(const FindText: WideString); safecall; + function Get_Version: SYSINT; safecall; + function EncodeString(const bstrValue: WideString; const bstrCharSet: WideString; + bUseUTF8: WordBool): WideString; safecall; + property ShellFeaturesEnabled: WordBool read Get_ShellFeaturesEnabled; + property SearchAssistantDefault: WordBool read Get_SearchAssistantDefault; + property Searches: ISearches read Get_Searches; + property InWebFolder: WordBool read Get_InWebFolder; + property EventHandled: WordBool write Set_EventHandled; + property ASProvider: WideString read Get_ASProvider write Set_ASProvider; + property ASSetting: SYSINT read Get_ASSetting write Set_ASSetting; + property Version: SYSINT read Get_Version; + end; + +// *********************************************************************// +// DispIntf: ISearchAssistantOCDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {72423E8F-8011-11D2-BE79-00A0C9A83DA1} +// *********************************************************************// + ISearchAssistantOCDisp = dispinterface + ['{72423E8F-8011-11D2-BE79-00A0C9A83DA1}'] + procedure AddNextMenuItem(const bstrText: WideString; idItem: Integer); dispid 1; + procedure SetDefaultSearchUrl(const bstrUrl: WideString); dispid 2; + procedure NavigateToDefaultSearch; dispid 3; + function IsRestricted(const bstrGuid: WideString): WordBool; dispid 4; + property ShellFeaturesEnabled: WordBool readonly dispid 5; + property SearchAssistantDefault: WordBool readonly dispid 6; + property Searches: ISearches readonly dispid 7; + property InWebFolder: WordBool readonly dispid 8; + procedure PutProperty(bPerLocale: WordBool; const bstrName: WideString; + const bstrValue: WideString); dispid 9; + function GetProperty(bPerLocale: WordBool; const bstrName: WideString): WideString; dispid 10; + property EventHandled: WordBool writeonly dispid 11; + procedure ResetNextMenu; dispid 12; + procedure FindOnWeb; dispid 13; + procedure FindFilesOrFolders; dispid 14; + procedure FindComputer; dispid 15; + procedure FindPrinter; dispid 16; + procedure FindPeople; dispid 17; + function GetSearchAssistantURL(bSubstitute: WordBool; bCustomize: WordBool): WideString; dispid 18; + procedure NotifySearchSettingsChanged; dispid 19; + property ASProvider: WideString dispid 20; + property ASSetting: SYSINT dispid 21; + procedure NETDetectNextNavigate; dispid 22; + procedure PutFindText(const FindText: WideString); dispid 23; + property Version: SYSINT readonly dispid 24; + function EncodeString(const bstrValue: WideString; const bstrCharSet: WideString; + bUseUTF8: WordBool): WideString; dispid 25; + end; + +// *********************************************************************// +// Interface: ISearchAssistantOC2 +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {72423E8F-8011-11D2-BE79-00A0C9A83DA2} +// *********************************************************************// + ISearchAssistantOC2 = interface(ISearchAssistantOC) + ['{72423E8F-8011-11D2-BE79-00A0C9A83DA2}'] + function Get_ShowFindPrinter: WordBool; safecall; + property ShowFindPrinter: WordBool read Get_ShowFindPrinter; + end; + +// *********************************************************************// +// DispIntf: ISearchAssistantOC2Disp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {72423E8F-8011-11D2-BE79-00A0C9A83DA2} +// *********************************************************************// + ISearchAssistantOC2Disp = dispinterface + ['{72423E8F-8011-11D2-BE79-00A0C9A83DA2}'] + property ShowFindPrinter: WordBool readonly dispid 26; + procedure AddNextMenuItem(const bstrText: WideString; idItem: Integer); dispid 1; + procedure SetDefaultSearchUrl(const bstrUrl: WideString); dispid 2; + procedure NavigateToDefaultSearch; dispid 3; + function IsRestricted(const bstrGuid: WideString): WordBool; dispid 4; + property ShellFeaturesEnabled: WordBool readonly dispid 5; + property SearchAssistantDefault: WordBool readonly dispid 6; + property Searches: ISearches readonly dispid 7; + property InWebFolder: WordBool readonly dispid 8; + procedure PutProperty(bPerLocale: WordBool; const bstrName: WideString; + const bstrValue: WideString); dispid 9; + function GetProperty(bPerLocale: WordBool; const bstrName: WideString): WideString; dispid 10; + property EventHandled: WordBool writeonly dispid 11; + procedure ResetNextMenu; dispid 12; + procedure FindOnWeb; dispid 13; + procedure FindFilesOrFolders; dispid 14; + procedure FindComputer; dispid 15; + procedure FindPrinter; dispid 16; + procedure FindPeople; dispid 17; + function GetSearchAssistantURL(bSubstitute: WordBool; bCustomize: WordBool): WideString; dispid 18; + procedure NotifySearchSettingsChanged; dispid 19; + property ASProvider: WideString dispid 20; + property ASSetting: SYSINT dispid 21; + procedure NETDetectNextNavigate; dispid 22; + procedure PutFindText(const FindText: WideString); dispid 23; + property Version: SYSINT readonly dispid 24; + function EncodeString(const bstrValue: WideString; const bstrCharSet: WideString; + bUseUTF8: WordBool): WideString; dispid 25; + end; + +// *********************************************************************// +// DispIntf: _SearchAssistantEvents +// Flags: (4112) Hidden Dispatchable +// GUID: {1611FDDA-445B-11D2-85DE-00C04FA35C89} +// *********************************************************************// + _SearchAssistantEvents = dispinterface + ['{1611FDDA-445B-11D2-85DE-00C04FA35C89}'] + procedure OnNextMenuSelect(idItem: Integer); dispid 1; + procedure OnNewSearch; dispid 2; + end; + + +// *********************************************************************// +// OLE Control Proxy class declaration +// Control Name : TWebBrowser_V1 +// Help String : WebBrowser Control +// Default Interface: IWebBrowser +// Def. Intf. DISP? : No +// Event Interface: DWebBrowserEvents +// TypeFlags : (34) CanCreate Control +// *********************************************************************// + TWebBrowser_V1BeforeNavigate = procedure(Sender: TObject; const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; + var PostData: OleVariant; + const Headers: WideString; + var Cancel: WordBool) of object; + TWebBrowser_V1NavigateComplete = procedure(Sender: TObject; const URL: WideString) of object; + TWebBrowser_V1StatusTextChange = procedure(Sender: TObject; const Text: WideString) of object; + TWebBrowser_V1ProgressChange = procedure(Sender: TObject; Progress: Integer; ProgressMax: Integer) of object; + TWebBrowser_V1CommandStateChange = procedure(Sender: TObject; Command: Integer; Enable: WordBool) of object; + TWebBrowser_V1NewWindow = procedure(Sender: TObject; const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; + var PostData: OleVariant; + const Headers: WideString; + var Processed: WordBool) of object; + TWebBrowser_V1TitleChange = procedure(Sender: TObject; const Text: WideString) of object; + TWebBrowser_V1FrameBeforeNavigate = procedure(Sender: TObject; const URL: WideString; + Flags: Integer; + const TargetFrameName: WideString; + var PostData: OleVariant; + const Headers: WideString; + var Cancel: WordBool) of object; + TWebBrowser_V1FrameNavigateComplete = procedure(Sender: TObject; const URL: WideString) of object; + TWebBrowser_V1FrameNewWindow = procedure(Sender: TObject; const URL: WideString; Flags: Integer; + const TargetFrameName: WideString; + var PostData: OleVariant; + const Headers: WideString; + var Processed: WordBool) of object; + TWebBrowser_V1Quit = procedure(Sender: TObject; var Cancel: WordBool) of object; + TWebBrowser_V1PropertyChange = procedure(Sender: TObject; const Property_: WideString) of object; + + TWebBrowser_V1 = class(TOleControl) + private + FOnBeforeNavigate: TWebBrowser_V1BeforeNavigate; + FOnNavigateComplete: TWebBrowser_V1NavigateComplete; + FOnStatusTextChange: TWebBrowser_V1StatusTextChange; + FOnProgressChange: TWebBrowser_V1ProgressChange; + FOnDownloadComplete: TNotifyEvent; + FOnCommandStateChange: TWebBrowser_V1CommandStateChange; + FOnDownloadBegin: TNotifyEvent; + FOnNewWindow: TWebBrowser_V1NewWindow; + FOnTitleChange: TWebBrowser_V1TitleChange; + FOnFrameBeforeNavigate: TWebBrowser_V1FrameBeforeNavigate; + FOnFrameNavigateComplete: TWebBrowser_V1FrameNavigateComplete; + FOnFrameNewWindow: TWebBrowser_V1FrameNewWindow; + FOnQuit: TWebBrowser_V1Quit; + FOnWindowMove: TNotifyEvent; + FOnWindowResize: TNotifyEvent; + FOnWindowActivate: TNotifyEvent; + FOnPropertyChange: TWebBrowser_V1PropertyChange; + FIntf: IWebBrowser; + function GetControlInterface: IWebBrowser; + protected + procedure CreateControl; + procedure InitControlData; override; + function Get_Application: IDispatch; + function Get_Parent: IDispatch; + function Get_Container: IDispatch; + function Get_Document: IDispatch; + public + procedure GoBack; + procedure GoForward; + procedure GoHome; + procedure GoSearch; + procedure Navigate(const URL: WideString); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); overload; + procedure Refresh; + procedure Refresh2; overload; + procedure Refresh2(var Level: OleVariant); overload; + procedure Stop; + property ControlInterface: IWebBrowser read GetControlInterface; + property DefaultInterface: IWebBrowser read GetControlInterface; + property Application: IDispatch index 200 read GetIDispatchProp; + property Parent: IDispatch index 201 read GetIDispatchProp; + property Container: IDispatch index 202 read GetIDispatchProp; + property Document: IDispatch index 203 read GetIDispatchProp; + property TopLevelContainer: WordBool index 204 read GetWordBoolProp; + property Type_: WideString index 205 read GetWideStringProp; + property LocationName: WideString index 210 read GetWideStringProp; + property LocationURL: WideString index 211 read GetWideStringProp; + property Busy: WordBool index 212 read GetWordBoolProp; + published + property TabStop; + property Align; + property DragCursor; + property DragMode; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property Visible; + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnStartDrag; + property OnBeforeNavigate: TWebBrowser_V1BeforeNavigate read FOnBeforeNavigate write FOnBeforeNavigate; + property OnNavigateComplete: TWebBrowser_V1NavigateComplete read FOnNavigateComplete write FOnNavigateComplete; + property OnStatusTextChange: TWebBrowser_V1StatusTextChange read FOnStatusTextChange write FOnStatusTextChange; + property OnProgressChange: TWebBrowser_V1ProgressChange read FOnProgressChange write FOnProgressChange; + property OnDownloadComplete: TNotifyEvent read FOnDownloadComplete write FOnDownloadComplete; + property OnCommandStateChange: TWebBrowser_V1CommandStateChange read FOnCommandStateChange write FOnCommandStateChange; + property OnDownloadBegin: TNotifyEvent read FOnDownloadBegin write FOnDownloadBegin; + property OnNewWindow: TWebBrowser_V1NewWindow read FOnNewWindow write FOnNewWindow; + property OnTitleChange: TWebBrowser_V1TitleChange read FOnTitleChange write FOnTitleChange; + property OnFrameBeforeNavigate: TWebBrowser_V1FrameBeforeNavigate read FOnFrameBeforeNavigate write FOnFrameBeforeNavigate; + property OnFrameNavigateComplete: TWebBrowser_V1FrameNavigateComplete read FOnFrameNavigateComplete write FOnFrameNavigateComplete; + property OnFrameNewWindow: TWebBrowser_V1FrameNewWindow read FOnFrameNewWindow write FOnFrameNewWindow; + property OnQuit: TWebBrowser_V1Quit read FOnQuit write FOnQuit; + property OnWindowMove: TNotifyEvent read FOnWindowMove write FOnWindowMove; + property OnWindowResize: TNotifyEvent read FOnWindowResize write FOnWindowResize; + property OnWindowActivate: TNotifyEvent read FOnWindowActivate write FOnWindowActivate; + property OnPropertyChange: TWebBrowser_V1PropertyChange read FOnPropertyChange write FOnPropertyChange; + end; + + +// *********************************************************************// +// OLE Control Proxy class declaration +// Control Name : TWebBrowser +// Help String : WebBrowser Control +// Default Interface: IWebBrowser2 +// Def. Intf. DISP? : No +// Event Interface: DWebBrowserEvents2 +// TypeFlags : (34) CanCreate Control +// *********************************************************************// + TWebBrowserStatusTextChange = procedure(Sender: TObject; const Text: WideString) of object; + TWebBrowserProgressChange = procedure(Sender: TObject; Progress: Integer; ProgressMax: Integer) of object; + TWebBrowserCommandStateChange = procedure(Sender: TObject; Command: Integer; Enable: WordBool) of object; + TWebBrowserTitleChange = procedure(Sender: TObject; const Text: WideString) of object; + TWebBrowserPropertyChange = procedure(Sender: TObject; const szProperty: WideString) of object; + TWebBrowserBeforeNavigate2 = procedure(Sender: TObject; const pDisp: IDispatch; + var URL: OleVariant; + var Flags: OleVariant; + var TargetFrameName: OleVariant; + var PostData: OleVariant; + var Headers: OleVariant; + var Cancel: WordBool) of object; + TWebBrowserNewWindow2 = procedure(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool) of object; + TWebBrowserNavigateComplete2 = procedure(Sender: TObject; const pDisp: IDispatch; + var URL: OleVariant) of object; + TWebBrowserDocumentComplete = procedure(Sender: TObject; const pDisp: IDispatch; + var URL: OleVariant) of object; + TWebBrowserOnVisible = procedure(Sender: TObject; Visible: WordBool) of object; + TWebBrowserOnToolBar = procedure(Sender: TObject; ToolBar: WordBool) of object; + TWebBrowserOnMenuBar = procedure(Sender: TObject; MenuBar: WordBool) of object; + TWebBrowserOnStatusBar = procedure(Sender: TObject; StatusBar: WordBool) of object; + TWebBrowserOnFullScreen = procedure(Sender: TObject; FullScreen: WordBool) of object; + TWebBrowserOnTheaterMode = procedure(Sender: TObject; TheaterMode: WordBool) of object; + TWebBrowserWindowSetResizable = procedure(Sender: TObject; Resizable: WordBool) of object; + TWebBrowserWindowSetLeft = procedure(Sender: TObject; Left: Integer) of object; + TWebBrowserWindowSetTop = procedure(Sender: TObject; Top: Integer) of object; + TWebBrowserWindowSetWidth = procedure(Sender: TObject; Width: Integer) of object; + TWebBrowserWindowSetHeight = procedure(Sender: TObject; Height: Integer) of object; + TWebBrowserWindowClosing = procedure(Sender: TObject; IsChildWindow: WordBool; + var Cancel: WordBool) of object; + TWebBrowserClientToHostWindow = procedure(Sender: TObject; var CX: Integer; var CY: Integer) of object; + TWebBrowserSetSecureLockIcon = procedure(Sender: TObject; SecureLockIcon: Integer) of object; + TWebBrowserFileDownload = procedure(Sender: TObject; var Cancel: WordBool) of object; + + TWebBrowser = class(TOleControl) + private + FOnStatusTextChange: TWebBrowserStatusTextChange; + FOnProgressChange: TWebBrowserProgressChange; + FOnCommandStateChange: TWebBrowserCommandStateChange; + FOnDownloadBegin: TNotifyEvent; + FOnDownloadComplete: TNotifyEvent; + FOnTitleChange: TWebBrowserTitleChange; + FOnPropertyChange: TWebBrowserPropertyChange; + FOnBeforeNavigate2: TWebBrowserBeforeNavigate2; + FOnNewWindow2: TWebBrowserNewWindow2; + FOnNavigateComplete2: TWebBrowserNavigateComplete2; + FOnDocumentComplete: TWebBrowserDocumentComplete; + FOnQuit: TNotifyEvent; + FOnVisible: TWebBrowserOnVisible; + FOnToolBar: TWebBrowserOnToolBar; + FOnMenuBar: TWebBrowserOnMenuBar; + FOnStatusBar: TWebBrowserOnStatusBar; + FOnFullScreen: TWebBrowserOnFullScreen; + FOnTheaterMode: TWebBrowserOnTheaterMode; + FOnWindowSetResizable: TWebBrowserWindowSetResizable; + FOnWindowSetLeft: TWebBrowserWindowSetLeft; + FOnWindowSetTop: TWebBrowserWindowSetTop; + FOnWindowSetWidth: TWebBrowserWindowSetWidth; + FOnWindowSetHeight: TWebBrowserWindowSetHeight; + FOnWindowClosing: TWebBrowserWindowClosing; + FOnClientToHostWindow: TWebBrowserClientToHostWindow; + FOnSetSecureLockIcon: TWebBrowserSetSecureLockIcon; + FOnFileDownload: TWebBrowserFileDownload; + FIntf: IWebBrowser2; + function GetControlInterface: IWebBrowser2; + protected + procedure CreateControl; + procedure InitControlData; override; + function Get_Application: IDispatch; + function Get_Parent: IDispatch; + function Get_Container: IDispatch; + function Get_Document: IDispatch; + public + procedure GoBack; + procedure GoForward; + procedure GoHome; + procedure GoSearch; + procedure Navigate(const URL: WideString); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; var TargetFrameName: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); overload; + procedure Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); overload; + procedure Refresh; + procedure Refresh2; overload; + procedure Refresh2(var Level: OleVariant); overload; + procedure Stop; + procedure Quit; + procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); + procedure PutProperty(const Property_: WideString; vtValue: OleVariant); + function GetProperty(const Property_: WideString): OleVariant; + procedure Navigate2(var URL: OleVariant); overload; + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant); overload; + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; var TargetFrameName: OleVariant); overload; + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); overload; + procedure Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); overload; + function QueryStatusWB(cmdID: OLECMDID): OLECMDF; + procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload; + procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); overload; + procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; + var pvaOut: OleVariant); overload; + procedure ShowBrowserBar(var pvaClsid: OleVariant); overload; + procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant); overload; + procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant; + var pvarSize: OleVariant); overload; + property ControlInterface: IWebBrowser2 read GetControlInterface; + property DefaultInterface: IWebBrowser2 read GetControlInterface; + property Application: IDispatch index 200 read GetIDispatchProp; + property Parent: IDispatch index 201 read GetIDispatchProp; + property Container: IDispatch index 202 read GetIDispatchProp; + property Document: IDispatch index 203 read GetIDispatchProp; + property TopLevelContainer: WordBool index 204 read GetWordBoolProp; + property Type_: WideString index 205 read GetWideStringProp; + property LocationName: WideString index 210 read GetWideStringProp; + property LocationURL: WideString index 211 read GetWideStringProp; + property Busy: WordBool index 212 read GetWordBoolProp; + property Name: WideString index 0 read GetWideStringProp; + property HWND: Integer index -515 read GetIntegerProp; + property FullName: WideString index 400 read GetWideStringProp; + property Path: WideString index 401 read GetWideStringProp; + property ReadyState: TOleEnum index -525 read GetTOleEnumProp; + published + property TabStop; + property Align; + property DragCursor; + property DragMode; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabOrder; + property OnDragDrop; + property OnDragOver; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnStartDrag; + property Visible: WordBool index 402 read GetWordBoolProp write SetWordBoolProp stored False; + property StatusBar: WordBool index 403 read GetWordBoolProp write SetWordBoolProp stored False; + property StatusText: WideString index 404 read GetWideStringProp write SetWideStringProp stored False; + property ToolBar: Integer index 405 read GetIntegerProp write SetIntegerProp stored False; + property MenuBar: WordBool index 406 read GetWordBoolProp write SetWordBoolProp stored False; + property FullScreen: WordBool index 407 read GetWordBoolProp write SetWordBoolProp stored False; + property Offline: WordBool index 550 read GetWordBoolProp write SetWordBoolProp stored False; + property Silent: WordBool index 551 read GetWordBoolProp write SetWordBoolProp stored False; + property RegisterAsBrowser: WordBool index 552 read GetWordBoolProp write SetWordBoolProp stored False; + property RegisterAsDropTarget: WordBool index 553 read GetWordBoolProp write SetWordBoolProp stored False; + property TheaterMode: WordBool index 554 read GetWordBoolProp write SetWordBoolProp stored False; + property AddressBar: WordBool index 555 read GetWordBoolProp write SetWordBoolProp stored False; + property Resizable: WordBool index 556 read GetWordBoolProp write SetWordBoolProp stored False; + property OnStatusTextChange: TWebBrowserStatusTextChange read FOnStatusTextChange write FOnStatusTextChange; + property OnProgressChange: TWebBrowserProgressChange read FOnProgressChange write FOnProgressChange; + property OnCommandStateChange: TWebBrowserCommandStateChange read FOnCommandStateChange write FOnCommandStateChange; + property OnDownloadBegin: TNotifyEvent read FOnDownloadBegin write FOnDownloadBegin; + property OnDownloadComplete: TNotifyEvent read FOnDownloadComplete write FOnDownloadComplete; + property OnTitleChange: TWebBrowserTitleChange read FOnTitleChange write FOnTitleChange; + property OnPropertyChange: TWebBrowserPropertyChange read FOnPropertyChange write FOnPropertyChange; + property OnBeforeNavigate2: TWebBrowserBeforeNavigate2 read FOnBeforeNavigate2 write FOnBeforeNavigate2; + property OnNewWindow2: TWebBrowserNewWindow2 read FOnNewWindow2 write FOnNewWindow2; + property OnNavigateComplete2: TWebBrowserNavigateComplete2 read FOnNavigateComplete2 write FOnNavigateComplete2; + property OnDocumentComplete: TWebBrowserDocumentComplete read FOnDocumentComplete write FOnDocumentComplete; + property OnQuit: TNotifyEvent read FOnQuit write FOnQuit; + property OnVisible: TWebBrowserOnVisible read FOnVisible write FOnVisible; + property OnToolBar: TWebBrowserOnToolBar read FOnToolBar write FOnToolBar; + property OnMenuBar: TWebBrowserOnMenuBar read FOnMenuBar write FOnMenuBar; + property OnStatusBar: TWebBrowserOnStatusBar read FOnStatusBar write FOnStatusBar; + property OnFullScreen: TWebBrowserOnFullScreen read FOnFullScreen write FOnFullScreen; + property OnTheaterMode: TWebBrowserOnTheaterMode read FOnTheaterMode write FOnTheaterMode; + property OnWindowSetResizable: TWebBrowserWindowSetResizable read FOnWindowSetResizable write FOnWindowSetResizable; + property OnWindowSetLeft: TWebBrowserWindowSetLeft read FOnWindowSetLeft write FOnWindowSetLeft; + property OnWindowSetTop: TWebBrowserWindowSetTop read FOnWindowSetTop write FOnWindowSetTop; + property OnWindowSetWidth: TWebBrowserWindowSetWidth read FOnWindowSetWidth write FOnWindowSetWidth; + property OnWindowSetHeight: TWebBrowserWindowSetHeight read FOnWindowSetHeight write FOnWindowSetHeight; + property OnWindowClosing: TWebBrowserWindowClosing read FOnWindowClosing write FOnWindowClosing; + property OnClientToHostWindow: TWebBrowserClientToHostWindow read FOnClientToHostWindow write FOnClientToHostWindow; + property OnSetSecureLockIcon: TWebBrowserSetSecureLockIcon read FOnSetSecureLockIcon write FOnSetSecureLockIcon; + property OnFileDownload: TWebBrowserFileDownload read FOnFileDownload write FOnFileDownload; + end; + +// *********************************************************************// +// The Class CoInternetExplorer provides a Create and CreateRemote method to +// create instances of the default interface IWebBrowser2 exposed by +// the CoClass InternetExplorer. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoInternetExplorer = class + class function Create: IWebBrowser2; + class function CreateRemote(const MachineName: string): IWebBrowser2; + end; + +// *********************************************************************// +// The Class CoShellBrowserWindow provides a Create and CreateRemote method to +// create instances of the default interface IWebBrowser2 exposed by +// the CoClass ShellBrowserWindow. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoShellBrowserWindow = class + class function Create: IWebBrowser2; + class function CreateRemote(const MachineName: string): IWebBrowser2; + end; + +// *********************************************************************// +// The Class CoShellWindows provides a Create and CreateRemote method to +// create instances of the default interface IShellWindows exposed by +// the CoClass ShellWindows. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoShellWindows = class + class function Create: IShellWindows; + class function CreateRemote(const MachineName: string): IShellWindows; + end; + +// *********************************************************************// +// The Class CoShellUIHelper provides a Create and CreateRemote method to +// create instances of the default interface IShellUIHelper exposed by +// the CoClass ShellUIHelper. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoShellUIHelper = class + class function Create: IShellUIHelper; + class function CreateRemote(const MachineName: string): IShellUIHelper; + end; + +// *********************************************************************// +// The Class CoShellNameSpace provides a Create and CreateRemote method to +// create instances of the default interface IShellNameSpace exposed by +// the CoClass ShellNameSpace. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoShellNameSpace = class + class function Create: IShellNameSpace; + class function CreateRemote(const MachineName: string): IShellNameSpace; + end; + +// *********************************************************************// +// The Class CoCScriptErrorList provides a Create and CreateRemote method to +// create instances of the default interface IScriptErrorList exposed by +// the CoClass CScriptErrorList. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoCScriptErrorList = class + class function Create: IScriptErrorList; + class function CreateRemote(const MachineName: string): IScriptErrorList; + end; + +// *********************************************************************// +// The Class CoSearchAssistantOC provides a Create and CreateRemote method to +// create instances of the default interface ISearchAssistantOC2 exposed by +// the CoClass SearchAssistantOC. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoSearchAssistantOC = class + class function Create: ISearchAssistantOC2; + class function CreateRemote(const MachineName: string): ISearchAssistantOC2; + end; + +procedure Register; + +resourcestring + dtlServerPage = 'ActiveX'; + +implementation + +uses ComObj; + +procedure TWebBrowser_V1.InitControlData; +const + CEventDispIDs: array [0..16] of DWORD = ( + $00000064, $00000065, $00000066, $0000006C, $00000068, $00000069, + $0000006A, $0000006B, $00000071, $000000C8, $000000C9, $000000CC, + $00000067, $0000006D, $0000006E, $0000006F, $00000070); + CControlData: TControlData2 = ( + ClassID: '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}'; + EventIID: '{EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B}'; + EventCount: 17; + EventDispIDs: @CEventDispIDs; + LicenseKey: nil (*HR:$80040154*); + Flags: $00000000; + Version: 401); +begin + ControlData := @CControlData; + TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnBeforeNavigate) - Cardinal(Self); +end; + +procedure TWebBrowser_V1.CreateControl; + + procedure DoCreate; + begin + FIntf := IUnknown(OleObject) as IWebBrowser; + end; + +begin + if FIntf = nil then DoCreate; +end; + +function TWebBrowser_V1.GetControlInterface: IWebBrowser; +begin + CreateControl; + Result := FIntf; +end; + +function TWebBrowser_V1.Get_Application: IDispatch; +begin + Result := DefaultInterface.Application; +end; + +function TWebBrowser_V1.Get_Parent: IDispatch; +begin + Result := DefaultInterface.Parent; +end; + +function TWebBrowser_V1.Get_Container: IDispatch; +begin + Result := DefaultInterface.Container; +end; + +function TWebBrowser_V1.Get_Document: IDispatch; +begin + Result := DefaultInterface.Document; +end; + +procedure TWebBrowser_V1.GoBack; +begin + DefaultInterface.GoBack; +end; + +procedure TWebBrowser_V1.GoForward; +begin + DefaultInterface.GoForward; +end; + +procedure TWebBrowser_V1.GoHome; +begin + DefaultInterface.GoHome; +end; + +procedure TWebBrowser_V1.GoSearch; +begin + DefaultInterface.GoSearch; +end; + +procedure TWebBrowser_V1.Navigate(const URL: WideString); +begin + DefaultInterface.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser_V1.Navigate(const URL: WideString; var Flags: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser_V1.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser_V1.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, PostData, EmptyParam); +end; + +procedure TWebBrowser_V1.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, PostData, Headers); +end; + +procedure TWebBrowser_V1.Refresh; +begin + DefaultInterface.Refresh; +end; + +procedure TWebBrowser_V1.Refresh2; +begin + DefaultInterface.Refresh2(EmptyParam); +end; + +procedure TWebBrowser_V1.Refresh2(var Level: OleVariant); +begin + DefaultInterface.Refresh2(Level); +end; + +procedure TWebBrowser_V1.Stop; +begin + DefaultInterface.Stop; +end; + +procedure TWebBrowser.InitControlData; +const + CEventDispIDs: array [0..26] of DWORD = ( + $00000066, $0000006C, $00000069, $0000006A, $00000068, $00000071, + $00000070, $000000FA, $000000FB, $000000FC, $00000103, $000000FD, + $000000FE, $000000FF, $00000100, $00000101, $00000102, $00000104, + $00000106, $00000108, $00000109, $0000010A, $0000010B, $00000107, + $0000010C, $0000010D, $0000010E); + CControlData: TControlData2 = ( + ClassID: '{8856F961-340A-11D0-A96B-00C04FD705A2}'; + EventIID: '{34A715A0-6587-11D0-924A-0020AFC7AC4D}'; + EventCount: 27; + EventDispIDs: @CEventDispIDs; + LicenseKey: nil (*HR:$80040154*); + Flags: $00000000; + Version: 401); +begin + ControlData := @CControlData; + TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnStatusTextChange) - Cardinal(Self); +end; + +procedure TWebBrowser.CreateControl; + + procedure DoCreate; + begin + FIntf := IUnknown(OleObject) as IWebBrowser2; + end; + +begin + if FIntf = nil then DoCreate; +end; + +function TWebBrowser.GetControlInterface: IWebBrowser2; +begin + CreateControl; + Result := FIntf; +end; + +function TWebBrowser.Get_Application: IDispatch; +begin + Result := DefaultInterface.Application; +end; + +function TWebBrowser.Get_Parent: IDispatch; +begin + Result := DefaultInterface.Parent; +end; + +function TWebBrowser.Get_Container: IDispatch; +begin + Result := DefaultInterface.Container; +end; + +function TWebBrowser.Get_Document: IDispatch; +begin + Result := DefaultInterface.Document; +end; + +procedure TWebBrowser.GoBack; +begin + DefaultInterface.GoBack; +end; + +procedure TWebBrowser.GoForward; +begin + DefaultInterface.GoForward; +end; + +procedure TWebBrowser.GoHome; +begin + DefaultInterface.GoHome; +end; + +procedure TWebBrowser.GoSearch; +begin + DefaultInterface.GoSearch; +end; + +procedure TWebBrowser.Navigate(const URL: WideString); +begin + DefaultInterface.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate(const URL: WideString; var Flags: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, PostData, EmptyParam); +end; + +procedure TWebBrowser.Navigate(const URL: WideString; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); +begin + DefaultInterface.Navigate(URL, Flags, TargetFrameName, PostData, Headers); +end; + +procedure TWebBrowser.Refresh; +begin + DefaultInterface.Refresh; +end; + +procedure TWebBrowser.Refresh2; +begin + DefaultInterface.Refresh2(EmptyParam); +end; + +procedure TWebBrowser.Refresh2(var Level: OleVariant); +begin + DefaultInterface.Refresh2(Level); +end; + +procedure TWebBrowser.Stop; +begin + DefaultInterface.Stop; +end; + +procedure TWebBrowser.Quit; +begin + DefaultInterface.Quit; +end; + +procedure TWebBrowser.ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); +begin + DefaultInterface.ClientToWindow(pcx, pcy); +end; + +procedure TWebBrowser.PutProperty(const Property_: WideString; vtValue: OleVariant); +begin + DefaultInterface.PutProperty(Property_, vtValue); +end; + +function TWebBrowser.GetProperty(const Property_: WideString): OleVariant; +begin + Result := DefaultInterface.GetProperty(Property_); +end; + +procedure TWebBrowser.Navigate2(var URL: OleVariant); +begin + DefaultInterface.Navigate2(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate2(var URL: OleVariant; var Flags: OleVariant); +begin + DefaultInterface.Navigate2(URL, Flags, EmptyParam, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant); +begin + DefaultInterface.Navigate2(URL, Flags, TargetFrameName, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant); +begin + DefaultInterface.Navigate2(URL, Flags, TargetFrameName, PostData, EmptyParam); +end; + +procedure TWebBrowser.Navigate2(var URL: OleVariant; var Flags: OleVariant; + var TargetFrameName: OleVariant; var PostData: OleVariant; + var Headers: OleVariant); +begin + DefaultInterface.Navigate2(URL, Flags, TargetFrameName, PostData, Headers); +end; + +function TWebBrowser.QueryStatusWB(cmdID: OLECMDID): OLECMDF; +begin + Result := DefaultInterface.QueryStatusWB(cmdID); +end; + +procedure TWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); +begin + DefaultInterface.ExecWB(cmdID, cmdexecopt, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); +begin + DefaultInterface.ExecWB(cmdID, cmdexecopt, pvaIn, EmptyParam); +end; + +procedure TWebBrowser.ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; + var pvaOut: OleVariant); +begin + DefaultInterface.ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut); +end; + +procedure TWebBrowser.ShowBrowserBar(var pvaClsid: OleVariant); +begin + DefaultInterface.ShowBrowserBar(pvaClsid, EmptyParam, EmptyParam); +end; + +procedure TWebBrowser.ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant); +begin + DefaultInterface.ShowBrowserBar(pvaClsid, pvarShow, EmptyParam); +end; + +procedure TWebBrowser.ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant; + var pvarSize: OleVariant); +begin + DefaultInterface.ShowBrowserBar(pvaClsid, pvarShow, pvarSize); +end; + +class function CoInternetExplorer.Create: IWebBrowser2; +begin + Result := CreateComObject(CLASS_InternetExplorer) as IWebBrowser2; +end; + +class function CoInternetExplorer.CreateRemote(const MachineName: string): IWebBrowser2; +begin + Result := CreateRemoteComObject(MachineName, CLASS_InternetExplorer) as IWebBrowser2; +end; + +class function CoShellBrowserWindow.Create: IWebBrowser2; +begin + Result := CreateComObject(CLASS_ShellBrowserWindow) as IWebBrowser2; +end; + +class function CoShellBrowserWindow.CreateRemote(const MachineName: string): IWebBrowser2; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ShellBrowserWindow) as IWebBrowser2; +end; + +class function CoShellWindows.Create: IShellWindows; +begin + Result := CreateComObject(CLASS_ShellWindows) as IShellWindows; +end; + +class function CoShellWindows.CreateRemote(const MachineName: string): IShellWindows; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ShellWindows) as IShellWindows; +end; + +class function CoShellUIHelper.Create: IShellUIHelper; +begin + Result := CreateComObject(CLASS_ShellUIHelper) as IShellUIHelper; +end; + +class function CoShellUIHelper.CreateRemote(const MachineName: string): IShellUIHelper; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ShellUIHelper) as IShellUIHelper; +end; + +class function CoShellNameSpace.Create: IShellNameSpace; +begin + Result := CreateComObject(CLASS_ShellNameSpace) as IShellNameSpace; +end; + +class function CoShellNameSpace.CreateRemote(const MachineName: string): IShellNameSpace; +begin + Result := CreateRemoteComObject(MachineName, CLASS_ShellNameSpace) as IShellNameSpace; +end; + +class function CoCScriptErrorList.Create: IScriptErrorList; +begin + Result := CreateComObject(CLASS_CScriptErrorList) as IScriptErrorList; +end; + +class function CoCScriptErrorList.CreateRemote(const MachineName: string): IScriptErrorList; +begin + Result := CreateRemoteComObject(MachineName, CLASS_CScriptErrorList) as IScriptErrorList; +end; + +class function CoSearchAssistantOC.Create: ISearchAssistantOC2; +begin + Result := CreateComObject(CLASS_SearchAssistantOC) as ISearchAssistantOC2; +end; + +class function CoSearchAssistantOC.CreateRemote(const MachineName: string): ISearchAssistantOC2; +begin + Result := CreateRemoteComObject(MachineName, CLASS_SearchAssistantOC) as ISearchAssistantOC2; +end; + +procedure Register; +begin + RegisterComponents('ActiveX',[TWebBrowser_V1, TWebBrowser]); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/common/ToolsUtils.pas b/official/1.100/examples/windows/delphitools/common/ToolsUtils.pas new file mode 100644 index 0000000..e06a476 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/common/ToolsUtils.pas @@ -0,0 +1,377 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is ToolsUtils.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2007-02-04 19:37:27 +0100 (dim., 04 févr. 2007) $ } +{ } +{**************************************************************************************************} + +unit ToolsUtils; + +{$I JCL.INC} + +interface + +uses + Windows, Classes, SysUtils, ComCtrls, Math, ComObj, ActiveX, Controls, Forms, + ImageHlp, JclFileUtils, JclStrings, JclSysInfo, JclRegistry, JclShell; + +const + PeViewerClassName = 'PeViewer.PeViewerControl'; + +function CreateOrGetOleObject(const ClassName: string): IDispatch; + +function FmtStrToInt(S: string): Integer; + +function GetImageBase(const FileName: TFileName): DWORD; + +function IntToExtended(I: Integer): Extended; + +function InfoTipVersionString(const FileName: TFileName): string; + +function IsPeViewerRegistred: Boolean; + +procedure LVColumnClick(Column: TListColumn); + +procedure LVCompare(ListView: TListView; Item1, Item2: TListItem; var Compare: Integer); + +procedure ListViewFocusFirstItem(ListView: TListView); + +procedure ListViewSelectAll(ListView: TListView; Deselect: Boolean = False); + +procedure ListViewToStrings(ListView: TListView; Strings: TStrings; + SelectedOnly: Boolean = False; Headers: Boolean = True); + +function MessBox(const Text: string; Flags: Word): Integer; + +function MessBoxFmt(const Fmt: string; const Args: array of const; Flags: Word): Integer; + +function SafeSubItemString(Item: TListItem; SubItemIndex: Integer): string; + +procedure SendEmail; + +procedure ShowToolsAboutBox; + +function Win32HelpFileName: TFileName; + +procedure Fix_ListViewBeforeClose(Form: TForm); + +procedure D4FixCoolBarResizePaint(CoolBar: TObject); + +implementation + +uses + About, CommCtrl, JclPeImage, JclWin32; + +resourcestring + RsJCLLink = 'Jedi Code Library;http://delphi-jedi.org/Jedi:CODELIBJCL'; + RsEmailAddress = 'mailto:petr.v@mujmail.cz?subject=[Delphi Tools]'; + +function StrEmpty(const S: AnsiString): Boolean; +begin + Result := Length(Trim(S)) = 0; +end; + +function CreateOrGetOleObject(const ClassName: string): IDispatch; +var + ClassID: TCLSID; + Res: HResult; + Unknown: IUnknown; +begin + ClassID := ProgIDToClassID(ClassName); + Res := GetActiveObject(ClassID, nil, Unknown); + if Succeeded(Res) then + OleCheck(Unknown.QueryInterface(IDispatch, Result)) + else + begin + if Res <> MK_E_UNAVAILABLE then OleError(Res); + OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or + CLSCTX_LOCAL_SERVER, IDispatch, Result)); + end; +end; + +function FmtStrToInt(S: string): Integer; +var + I: Integer; +begin + I := 1; + while I <= Length(S) do + if not (S[I] in ['0'..'9', '-']) then Delete(S, I, 1) else Inc(I); + Result := StrToIntDef(S, 0); +end; + +function GetImageBase(const FileName: TFileName): DWORD; +var + NtHeaders32: TImageNtHeaders32; + NtHeaders64: TImageNtHeaders64; + ImageStream: TMemoryStream; + PETarget: TJclPeTarget; +begin + ImageStream := TMemoryStream.Create; + try + ImageStream.LoadFromFile(FileName); + PETarget := PeMapImgTarget(ImageStream.Memory); + finally + ImageStream.Free; + end; + if (PETarget = taWin32) and PeGetNtHeaders32(FileName, NtHeaders32) then + Result := NtHeaders32.OptionalHeader.ImageBase + else + if (PETarget = taWin64) and PeGetNtHeaders64(FileName, NtHeaders64) then + Result := NtHeaders64.OptionalHeader.ImageBase + else + Result := 0; +end; + +function IntToExtended(I: Integer): Extended; +begin + Result := I; +end; + +function InfoTipVersionString(const FileName: TFileName): string; +begin + Result := ''; + if VersionResourceAvailable(FileName) then + try + with TJclFileVersionInfo.Create(FileName) do + try + if not StrEmpty(FileVersion) then Result := FileVersion; + if not StrEmpty(FileDescription) then + Result := Format('%s'#13#10'%s', [Result, FileDescription]) + finally + Free; + end; + except + end; +end; + +function IsPeViewerRegistred: Boolean; +begin + Result := RegReadStringDef(HKEY_CLASSES_ROOT, PeViewerClassName, '', '') <> ''; +end; + +procedure LVColumnClick(Column: TListColumn); +var + ColIndex: Integer; + ListView: TListView; +begin + ListView := TListColumns(Column.Collection).Owner as TListView; + ColIndex := Column.Index; + with ListView do + begin + if Tag and $FF = ColIndex then + Tag := Tag xor $100 + else + Tag := ColIndex; + AlphaSort; + if Selected <> nil then Selected.MakeVisible(False); + end; +end; + +procedure LVCompare(ListView: TListView; Item1, Item2: TListItem; var Compare: Integer); +var + ColIndex: Integer; +begin + with ListView do + begin + ColIndex := Tag and $FF - 1; + if Columns[ColIndex + 1].Alignment = taLeftJustify then + begin + if ColIndex = -1 then + Compare := AnsiCompareText(Item1.Caption, Item2.Caption) + else + Compare := AnsiCompareText(Item1.SubItems[ColIndex], Item2.SubItems[ColIndex]); + end else + begin + if ColIndex = -1 then + Compare := FmtStrToInt(Item1.Caption) - FmtStrToInt(Item2.Caption) + else + Compare := FmtStrToInt(Item1.SubItems[ColIndex]) - FmtStrToInt(Item2.SubItems[ColIndex]); + end; + if Tag and $100 <> 0 then Compare := -Compare; + end; +end; + +procedure ListViewFocusFirstItem(ListView: TListView); +begin + with ListView do + if Items.Count > 0 then + begin + ItemFocused := Items[0]; + ItemFocused.Selected := True; + ItemFocused.MakeVisible(False); + end; +end; + +procedure ListViewSelectAll(ListView: TListView; Deselect: Boolean); +var + I: Integer; + H: THandle; + Data: Integer; + SaveOnSelectItem: TLVSelectItemEvent; +begin + with ListView do if MultiSelect then + begin + Items.BeginUpdate; + SaveOnSelectItem := OnSelectItem; + Screen.Cursor := crHourGlass; + try + H := Handle; + OnSelectItem := nil; + if Deselect then Data := 0 else Data := LVIS_SELECTED; + for I := 0 to Items.Count - 1 do + ListView_SetItemState(H, I, Data, LVIS_SELECTED); + finally + OnSelectItem := SaveOnSelectItem; + Items.EndUpdate; + Screen.Cursor := crDefault; + end; + end; +end; + +procedure ListViewToStrings(ListView: TListView; Strings: TStrings; + SelectedOnly: Boolean = False; Headers: Boolean = True); +var + R, C: Integer; + ColWidths: array of Word; + S: String; + + procedure AddLine; +begin + Strings.Add(TrimRight(S)); +end; + + function MakeCellStr(const Text: String; Index: Integer): String; +begin + with ListView.Columns[Index] do + if Alignment = taLeftJustify then + Result := StrPadRight(Text, ColWidths[Index] + 1) + else + Result := StrPadLeft(Text, ColWidths[Index]) + ' '; +end; + +begin + SetLength(S, 256); + with ListView do + begin + SetLength(ColWidths, Columns.Count); + if Headers then + for C := 0 to Columns.Count - 1 do + ColWidths[C] := Length(Trim(Columns[C].Caption)); + for R := 0 to Items.Count - 1 do + if not SelectedOnly or Items[R].Selected then + begin + ColWidths[0] := Max(ColWidths[0], Length(Trim(Items[R].Caption))); + for C := 0 to Items[R].SubItems.Count - 1 do + ColWidths[C + 1] := Max(ColWidths[C + 1], Length(Trim(Items[R].SubItems[C]))); + end; + Strings.BeginUpdate; + try + if Headers then + with Columns do + begin + S := ''; + for C := 0 to Count - 1 do + S := S + MakeCellStr(Items[C].Caption, C); + AddLine; + S := ''; + for C := 0 to Count - 1 do + S := S + StringOfChar('-', ColWidths[C]) + ' '; + AddLine; + end; + for R := 0 to Items.Count - 1 do + if not SelectedOnly or Items[R].Selected then + with Items[R] do + begin + S := MakeCellStr(Caption, 0); + for C := 0 to Min(SubItems.Count, Columns.Count - 1) - 1 do + S := S + MakeCellStr(SubItems[C], C + 1); + AddLine; + end; + finally + Strings.EndUpdate; + end; + end; +end; + +function MessBox(const Text: string; Flags: Word): Integer; +begin + with Application do Result := MessageBox(PChar(Text), PChar(Title), Flags); +end; + +function MessBoxFmt(const Fmt: string; const Args: array of const; Flags: Word): Integer; +begin + Result := MessBox(Format(Fmt, Args), Flags); +end; + +function SafeSubItemString(Item: TListItem; SubItemIndex: Integer): string; +begin + if Item.SubItems.Count > SubItemIndex then + Result := Item.SubItems[SubItemIndex] + else + Result := '' +end; + +procedure SendEmail; +begin + ShellExecEx(RsEmailAddress); +end; + +procedure ShowToolsAboutBox; +begin + ShowAbout([RsJCLLink], 18); +end; + +function Win32HelpFileName: TFileName; +begin + Result := RegReadStringDef(HKEY_LOCAL_MACHINE, + 'SOFTWARE\Borland\Borland Shared\MSHelp', 'RootDir', '') + '\Win32.hlp'; + if not FileExists(Result) then Result := ''; +end; + +procedure Fix_ListViewBeforeClose(Form: TForm); +var + I: Integer; +begin + with Form do + for I := 0 to ComponentCount - 1 do + if Components[I] is TListView then + with TListView(Components[I]) do + if OwnerData then Items.Count := 0; +end; + +procedure D4FixCoolBarResizePaint(CoolBar: TObject); +{$IFDEF DELPHI4} +var + R: TRect; +begin + with CoolBar as TCoolBar do + begin + R := ClientRect; + R.Left := R.Right - 8; + InvalidateRect(Handle, @R, True); + end; +end; +{$ELSE} +begin +end; +{$ENDIF} + +end. diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dof b/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dof new file mode 100644 index 0000000..c585742 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dof @@ -0,0 +1,134 @@ +[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= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=0 +MinorVer=5 +Release=4 +Build=9 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Petr Vones +FileDescription=Dependency Viewer +FileVersion=0.5.4.9 +InternalName=DEPENDVIEW +LegalCopyright=(c) 2002 Petr Vones +LegalTrademarks= +OriginalFilename=DEPENDVIEW.EXE +ProductName=Dependency Viewer +ProductVersion=0.5.4 diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dpr b/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dpr new file mode 100644 index 0000000..a4fe8a4 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.dpr @@ -0,0 +1,24 @@ +program DependView; + +{$I jcl.inc} + +uses + Forms, + SysUtils, + D6MdiMsgFix in '..\Common\D6MdiMsgFix.pas', + DependViewMain in 'DependViewMain.pas' {MainForm}, + FileViewer in 'FileViewer.pas' {FileViewerChild}, + ToolsUtils in '..\Common\ToolsUtils.pas', + About in '..\Common\About.pas' {AboutBox}, + FindDlg in '..\Common\FindDlg.pas' {FindTextForm}, + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'Dependency Viewer'; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.res b/official/1.100/examples/windows/delphitools/dependencyviewer/DependView.res new file mode 100644 index 0000000000000000000000000000000000000000..e3af7732026673895239e9ef31b2ad54e6db1b08 GIT binary patch literal 1672 zcmd^;!EX{#5XL|1*4o%uVtRKE9;%0i7&P`&O({teY>74K!K5LGNNj;njPb_*MNPPO z{|FBryy?*c5q~qwb{FN)lNTqbBf(V?ktv}#81Ovys>gbhZ>K^1dN1j(|BWzd71NXiDoj3MA2w8a+f>SqS1MD z;f}F6)-KKoy2I@#wIhpj+vA2x?btiBE##;x*>UX@&*i!M|E0|*Vv0V$cp5lHsU6S6 zZNsEu|BQ*W^HaL>Ls~ceBCY%@-H=p3r_)<{rl;E10lKS0_C&Jp!d^p8VVL(m$hXWr6sklddv6*<;)q+`}SJ?FIV6^^}LnX}2~;QKGjx6FA}!R5Z=QQ@)Zyu9`| zd8C2*YOAA`%IqgH>f4n1YIQx{Vg$V2mE=Ci!;3oT{ff_)m0Q$7*_!D!b(k zVcjL#)S3G$y3M_$PRacZuipdTcB}y{(nC9X<7RJ)nAx8SLq$QBg%3)TwZ% + Color = clBtnFace + ParentColor = False + OnResize = CoolBar1Resize + object ToolBar1: TToolBar + Left = 9 + Top = 0 + Width = 519 + Height = 22 + AutoSize = True + Caption = 'ToolBar1' + EdgeBorders = [] + Flat = True + Images = ToolbarImagesList + TabOrder = 0 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = Open1 + end + object ToolButton10: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton10' + ImageIndex = 18 + Style = tbsSeparator + end + object ToolButton8: TToolButton + Left = 31 + Top = 0 + Action = Copy1 + end + object ToolButton9: TToolButton + Left = 54 + Top = 0 + Action = Save1 + end + object ToolButton6: TToolButton + Left = 77 + Top = 0 + Action = Find1 + end + object ToolButton7: TToolButton + Left = 100 + Top = 0 + Width = 8 + Caption = 'ToolButton7' + ImageIndex = 19 + Style = tbsSeparator + end + object ToolButton2: TToolButton + Left = 108 + Top = 0 + Action = DumpPe1 + end + object ToolButton12: TToolButton + Left = 131 + Top = 0 + Action = Win32Help1 + end + object ToolButton11: TToolButton + Left = 154 + Top = 0 + Width = 8 + Caption = 'ToolButton11' + ImageIndex = 18 + Style = tbsSeparator + end + object ToolButton3: TToolButton + Left = 162 + Top = 0 + Action = WindowCascade1 + end + object ToolButton4: TToolButton + Left = 185 + Top = 0 + Action = WindowTileHorizontal1 + end + object ToolButton5: TToolButton + Left = 208 + Top = 0 + Action = WindowTileVertical1 + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 302 + Width = 536 + Height = 19 + Panels = < + item + Width = 50 + end> + end + object MainMenu: TMainMenu + Images = ToolbarImagesList + Left = 8 + Top = 272 + object File1: TMenuItem + Caption = 'File' + object Open2: TMenuItem + Action = Open1 + end + object Save2: TMenuItem + Action = Save1 + end + object N3: TMenuItem + Caption = '-' + end + object DumpPEfile1: TMenuItem + Action = DumpPe1 + end + object N1: TMenuItem + Caption = '-' + end + object Exit2: TMenuItem + Action = Exit1 + end + end + object Edit1: TMenuItem + Caption = 'Edit' + object Copy2: TMenuItem + Action = Copy1 + end + object Selectall2: TMenuItem + Action = SelectAll1 + end + object N4: TMenuItem + Caption = '-' + end + object Findtext1: TMenuItem + Action = Find1 + end + end + object Window1: TMenuItem + Caption = 'Window' + object Cascade1: TMenuItem + Action = WindowCascade1 + end + object TileHorizontally1: TMenuItem + Action = WindowTileHorizontal1 + end + object TileVertically1: TMenuItem + Action = WindowTileVertical1 + end + end + object Help1: TMenuItem + Caption = 'Help' + object Win32helpkeyword1: TMenuItem + Action = Win32Help1 + end + object N2: TMenuItem + Caption = '-' + end + object Sendamessage1: TMenuItem + Action = SendMail1 + end + object About2: TMenuItem + Action = About1 + end + end + end + object ActionList1: TActionList + Images = ToolbarImagesList + Left = 40 + Top = 272 + object Exit1: TAction + Caption = 'Exit' + Hint = 'Exit application' + ImageIndex = 2 + OnExecute = Exit1Execute + end + object Open1: TAction + Caption = 'Open...' + Hint = 'Open a file' + ImageIndex = 0 + ShortCut = 16463 + OnExecute = Open1Execute + end + object WindowCascade1: TWindowCascade + Category = 'Window' + Caption = 'Cascade' + Hint = 'Cascade' + ImageIndex = 5 + end + object WindowTileHorizontal1: TWindowTileHorizontal + Category = 'Window' + Caption = 'Tile Horizontally' + Hint = 'Tile Horizontally' + ImageIndex = 6 + end + object WindowTileVertical1: TWindowTileVertical + Category = 'Window' + Caption = 'Tile Vertically' + Hint = 'Tile Vertically' + ImageIndex = 7 + end + object Copy1: TAction + Caption = 'Copy' + Hint = 'Copy to clipboard' + ImageIndex = 4 + ShortCut = 16451 + OnExecute = Copy1Execute + OnUpdate = Copy1Update + end + object Save1: TAction + Tag = 1 + Caption = 'Save...' + Hint = 'Save to text file' + ImageIndex = 3 + ShortCut = 16467 + OnExecute = Copy1Execute + OnUpdate = Copy1Update + end + object SelectAll1: TAction + Caption = 'Select all' + Hint = 'Select all rows' + ImageIndex = 8 + ShortCut = 16449 + OnExecute = SelectAll1Execute + OnUpdate = SelectAll1Update + end + object Win32Help1: TAction + Caption = 'Find in Win32 API help' + Hint = 'Find in Win32 API help' + ImageIndex = 1 + ShortCut = 112 + OnExecute = Win32Help1Execute + OnUpdate = Win32Help1Update + end + object DumpPe1: TAction + Caption = 'Dump PE file' + Hint = 'Dump PE file' + ImageIndex = 9 + ShortCut = 16452 + OnExecute = DumpPe1Execute + OnUpdate = DumpPe1Update + end + object About1: TAction + Caption = 'About...' + Hint = 'About' + OnExecute = About1Execute + end + object SendMail1: TAction + Caption = 'Support' + ImageIndex = 10 + OnExecute = SendMail1Execute + end + object Find1: TAction + Caption = 'Find text' + Hint = 'Find text' + ImageIndex = 11 + ShortCut = 16454 + OnExecute = Find1Execute + OnUpdate = Find1Update + end + end + object ToolbarImagesList: TImageList + ShareImages = True + Left = 72 + Top = 272 + Bitmap = { + 494C01010C000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000004000000001002000000000000040 + 000000000000000000000000000000000000FFFFFF40FFFFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000004000FF + FF407F7F7F40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40000000400000004000000040000000400000004000000040000000400000 + 004000000040000000407F7F7F407F7F7F4000000040000000407F7F7F400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF408000004000000040000000407F7F7F400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40800000407F7F7F407F7F7F4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFFFF40800000408000 + 0040800000408000004080000040800000408000004080000040FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF400000004000000040000000407F7F7F4000FFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40800000407F7F7F4000FFFF4000FFFF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40800000400000FF4000000040000000407F7F + 7F40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4000000040FFFFFF400000FF400000FF400000FF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000400000FF400000FF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000400000FF400000FF400000FF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40800000408000004080000040800000408000 + 0040800000408000004080000040FFFFFF4080000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408000004080000040800000408000 + 0040800000408000004080000040800000408000004080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF400000FF400000FF400000FF400000FF400000FF400000FF400000 + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40800000400000FF400000FF400000FF400000 + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF4080000040000000400000FF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 004080000040800000408000004080000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000408000004080000040800000408000 + 0040800000408000004080000040800000400000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000000000 + 0000000000000000000000000080000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF0000000000000000000000 + 000000000000000000000000000000FFFF0000000080000000000000000000FF + FF00008080000000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 00000000008000000000000000000000000000000080000000000000000000FF + FF0000FFFF0000FFFF0000000080000000000000000000FFFF0000FFFF000000 + 00007F7F7F3F7F7F7F007F7F7F0000FFFF0000FFFF3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000FFFF0000FFFF000000000000000080000000000000000000FF + FF0000808000000000000000008000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFF00BFFFFF0000FFFF000000000000000000000000 + 00007F7F7F3F7F7F7F007F7F7F0000000000000000000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF00000000000000000000000080000000000000000000FF + FF0000808000000000000000000000000000BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000080000000000000000000000000000000000000 + 0000000000BFFFFFFF000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F00000000000000000000000080000000000000000000FF + FF00008080000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000080000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF0000000000000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F0000000000000000000000008000000000000000000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000080000000000000000000000000000000000000 + 0000000000BFFFFFFF000000000000000000FFFFFF0000000000000000BFFFFF + FF000000000000000000FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFF0000000000000000BFFFFFFF000000000000000000000000BFFFFF + FF000000003F7F7F7F0000000000000000000000008000000000000000000000 + 00007F7F7FBFBFBFBF0000000000000000000000000000000000000000000000 + 00007F7F7F000000000000000080000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F00000000000000000000000000000000007F7F7FBFBFBF + BF00BFBFBFBFBFBFBF00000000000000000000000000000000007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF000000000000FFFF0000FFFF0000FFFF000000 + 0000FFFFFF00000000000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FFFF0000FFFF0000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000000000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000000000000000 + 0000FFFFFF0000FFFF000000000000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFFBFFFFFFF00FFFFFF0000000000000000BFFFFFFF007F7F7F3F7F7F + 7F00FFFFFF3F7F7F7F007F7F7FBFFFFFFF007F7F7FBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000FFFF0000FFFF000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000000000FFFF0000FFFF0000FFFF00000000BFBFBFBF00BFBFBFBFBFBF + BF00000000BFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000000000BFFFFF + FF0000FFFF000000000000FFFFBFFFFFFF00000000BFFFFFFF0000FFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFF0000000000000000BFFFFFFF000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FF00BFBFBF000000 + FF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000000000FFFFFF0000FFFF00000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF0000000000000000BFFFFFFF007F7F7F3F7F7F + 7F00FFFFFF3F7F7F7F007F7F7F3F7F7F7F00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000FF000000FF000000FFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000000000000000000000FFFFBFFFFF + FF0000FFFFBFFFFFFF00000000BFFFFFFF0000FFFF0000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBFBFFFFFFF00000000BFFFFFFF000000000000FF + FF0000000000000000000000000000000000000000000000FF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F00000000800000000000000080000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00000000000000000000000000000000000000000000000000FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF000000000000000080000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF0000000000000000000000000000FF + FF0000FFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBF0000000000000000000000 + 000000000080000000000000008000000000FFFF00000000000000FFFFBFFFFF + FF0000FFFFBFFFFFFF0000FFFF00000000000000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFF000000000000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 000000000000000000000000008000000000000000000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF0000FFFF000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF000000003F7F7F7F00000000800000 + 000000000080000000000000008000000000FFFF00BFFFFF00000000000000FF + FF00FFFFFF0000FFFF000000000000FFFF00FFFFFF0000FFFF00000000BFFFFF + FF00000000BFFFFFFF0000000000000000007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000800000000000000080000000000000000000FFFF0000FFFF000000 + 000000000000000000000000000000FFFF0000FFFF0000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F000000008000000000000000800000 + 000000000080000000000000008000000000FFFF00BFFFFF0000FFFF00000000 + 000000FFFFBFFFFFFF0000FFFFBFFFFFFF000000000000000000FFFFFFBFFFFF + FF00000000000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 00000000000000000000000000800000000000FFFF0000000000000000000000 + 000000000000000000000000000000FFFF000000000000000000000000000000 + 000000000000000000000000000000FFFF000000008000000000000000000000 + 00000000003F7F7F7F0000000080000000000000008000000000000000800000 + 000000000080000000000000008000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F0000000000000000007F7F7F00000000000000000000000000000000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F007F7F7F0000FFFF00000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 00008000000080000000FFFFFF00800000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F0000FFFF0000FFFF00000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000000000000000FFFFFF0000000000000000000000 + 00000000FF0000000000000000007F7F7F000000000000000000000000008000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00800000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF0000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000080000000FFFFFF008000 + 000080000000800000008000000080000000800000008000000080000000FFFF + FF00800000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000000080000000FFFFFF008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0080000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00800000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000800000008000 + 00008000000080000000FFFFFF00800000008000000080000000800000008000 + 0000FFFFFF0080000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF0000000000000000000000000080000000800000008000 + 00008000000080000000800000008000000080000000FFFFFF00800000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000080000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF007F7F7F000000FF007F7F7F00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF000000FF000000FF000000FF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF0000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000000 + 000000000000000000000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF007F7F7F000000FF007F7F7F00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000FFFF000000 + 0000008080000080800000808000008080000080800000808000008080000080 + 80000080800000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF0000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000FFFF00FFFFFF0000FF + FF00000000000080800000808000008080000080800000808000008080000080 + 800000808000008080000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF000000FF007F7F7F0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000BFBFBF0000000000FF000000FF000000FF00 + 00000000FF00FF000000FF000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 000000000000000000000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF00000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 00000000000000000000000000000000000000FFFF00FFFFFF0000FFFF00FFFF + FF007F7F7F007F7F7F0000FFFF00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF000000FF000000FF00FFFFFF0000FFFF007F7F7F000000FF000000FF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF000000000000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF000000FF000000FF007F7F7F00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF000000FF000000FF000000FF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF000000FF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 7F00FFFF000000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 7F00FFFF0000FFFF00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000400000000100010000000000000200000000000000000000 + 000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + FFFFFF00FFFFFF00000000000000000000000000000000000000000000000000 + 0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + FFFFFFBFFFFFFF00FFFFFFBFFFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF00 + FFFFFFBFFFFFFF00FFFFFFBFFFFFFFBFFFE3FF7EC380F000FC419001C300F000 + 8800C003C201F0000000E003C003F0000000E003C003F0000000E003C003F000 + 0000E0030003F000000000010003E000000080000003C0000000E00700038000 + 0000E00F000380000000E00F000700000001E027000F00000001C073003F0001 + 000D9E7980FF0003D5537EFEC3FF0007FC00FC00FFFFFFFFFC00FC0080038003 + FC00FC0080038003FC00FC00800380030000E000800380030000E00080038003 + 0000E000800380030000E0078003800300238007800380030001800780038003 + 00008007800380030023801F800380030063801F8003800300C3801F80038003 + 0107801FFFFFFFFF03FFFFFFFFFFFFFFFFFFFFFFC007FF00FFFFF83FC007FF00 + 001FE00FC007FF00000FC007C007FF0000078003C007000000038003C0070000 + 00010001C007000000000001C0070000001F0001C0070023001F0001C0070001 + 001F0001C00700008FF18003C0070023FFF98003C0070063FF75C007C00700C3 + FF8FE00FC0070107FFFFF83FC00703FF00000000000000000000000000000000 + 000000000000} + end + object OpenFileDialog: TOpenDialog + Filter = + 'PE Exe files (*.exe;*.dll;*.bpl)|*.exe;*.dll;*.bpl|All files (*.' + + '*)|*.*' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 136 + Top = 272 + end + object ViewImageList: TImageList + ShareImages = True + Left = 104 + Top = 272 + Bitmap = { + 494C01010D000E00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000004000000001002000000000000040 + 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 + 000000000000000000000000000080808000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000008080800080808000FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000808080000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000080808000808080000000000000000000FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008080800000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000808080008080800000000000000000000000000000000000FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000808080008080800080808000808080008080800080808000808080008080 + 8000000000000000000000000000000000000000000000000000000000000000 + 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 + 00000000000000000000000000000000000000000000000000000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BFBF + BF00BFBFBF007F7F7F000000000000000000000000007F7F7F007F7F7F007F7F + 7F0000000000000000000000000000000000000000000000000000000000BFBF + BF00BFBFBF007F7F7F000000000000000000000000007F7F7F007F7F7F007F7F + 7F000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF0000000000FFFFFF0000FF0000FFFFFF0000FF0000FFFFFF00000000007F7F + 7F007F7F7F000000000000000000000000000000000000000000BFBFBF00BFBF + BF0000000000FFFFFF000000FF00FFFFFF000000FF00FFFFFF00000000007F7F + 7F007F7F7F0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F0000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000BFBFBF007F7F7F00FFFF + FF00000000000000000000FF0000007F0000007F00000000000000000000FFFF + FF007F7F7F007F7F7F00000000000000000000000000BFBFBF007F7F7F00FFFF + FF0000000000000000000000FF0000007F0000007F000000000000000000FFFF + FF007F7F7F007F7F7F00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF000000FF000000 + FF000000000000000000000000000000000000000000BFBFBF000000000000FF + 00000000000000FF0000007F000000FF0000007F0000007F00000000000000FF + 0000000000007F7F7F00000000000000000000000000BFBFBF00000000000000 + FF00000000000000FF0000007F000000FF0000007F0000007F00000000000000 + FF00000000007F7F7F00000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000FF000000 + FF0000000000000000000000000000000000000000000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF00000000000000000000000000FFFFFF0000000000FFFF + FF000000000000FF000000FF000000FF000000FF0000007F000000000000FFFF + FF00000000007F7F7F00000000000000000000000000FFFFFF0000000000FFFF + FF00000000000000FF000000FF000000FF000000FF0000007F0000000000FFFF + FF00000000007F7F7F00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF000000FF000000 + FF000000000000000000000000000000000000000000FFFFFF000000000000FF + 000000000000FFFFFF0000FF000000FF0000007F000000FF00000000000000FF + 000000000000BFBFBF00000000000000000000000000FFFFFF00000000000000 + FF0000000000FFFFFF000000FF000000FF0000007F000000FF00000000000000 + FF0000000000BFBFBF00000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF007F7F7F00FFFF + FF000000000000000000FFFFFF00FFFFFF0000FF00000000000000000000FFFF + FF007F7F7F00BFBFBF00000000000000000000000000FFFFFF007F7F7F00FFFF + FF000000000000000000FFFFFF00FFFFFF000000FF000000000000000000FFFF + FF007F7F7F00BFBFBF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF0000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00BFBF + BF0000000000FFFFFF0000FF0000FFFFFF0000FF0000FFFFFF0000000000BFBF + BF00BFBFBF000000000000000000000000000000000000000000FFFFFF00BFBF + BF0000000000FFFFFF000000FF00FFFFFF000000FF00FFFFFF0000000000BFBF + BF00BFBFBF0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00BFBFBF007F7F7F000000000000000000000000007F7F7F00BFBFBF00BFBF + BF0000000000000000000000000000000000000000000000000000000000FFFF + FF00BFBFBF007F7F7F000000000000000000000000007F7F7F00BFBFBF00BFBF + BF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00BFBFBF00BFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00BFBFBF00BFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF0000000000000000007F7F7F00000000007F7F7F00000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF00BFBF + BF0000FFFF00BFBFBF0000FFFF00BFBFBF0000FFFF00BFBFBF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + FF000000FF000000FF00000000000000000000000000000000000000FF000000 + FF0000000000000000007F7F7F00000000007F7F7F00000000000000FF000000 + FF000000FF000000000000000000000000000000000000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF000000000000FF + FF00BFBFBF0000FFFF00BFBFBF0000FFFF00BFBFBF0000FFFF00BFBFBF0000FF + FF0000000000FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000FF000000FF000000FF007F7F7F00000000007F7F7F000000FF000000 + FF000000FF00000000000000000000000000000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF000000000000000000000000000000000000000000FFFF + 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000 + 00000000000000000000000000000000000000000000FFFFFF0000FFFF000000 + 000000FFFF00BFBFBF0000FFFF00BFBFBF0000FFFF00BFBFBF0000FFFF00BFBF + BF0000FFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF00000000000000FF000000FF000000 + FF0000000000000000000000000000000000000000000000FF00000000000000 + FF000000FF000000FF007F7F7F00000000007F7F7F0000000000000000000000 + 00000000FF000000FF000000000000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000FF000000FF00000000000000FF000000FF000000 + 0000000000000000000000000000000000000000FF000000FF00000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000FF000000FF0000000000000000000000000000000000FFFF + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000000000007F000000000000007F00000000000000 + 0000000000000000000000000000000000000000FF000000FF00000000000000 + 0000000000000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000FF000000FF0000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000FF0000007F000000000000007F000000FF000000 + 0000000000000000000000000000000000000000FF000000FF00000000000000 + 000000000000000000007F7F7F00000000007F7F7F0000000000000000000000 + 0000000000000000FF000000FF0000000000000000000000000000000000FFFF + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000FF000000FF000000000000000000000000000000FF000000 + FF00000000000000000000000000000000000000FF000000FF00000000000000 + 0000000000000000000000007F000000000000007F000000FF00000000000000 + 0000000000000000FF000000FF0000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + 00000000FF000000FF000000FF000000000000000000000000000000FF000000 + FF000000FF000000000000000000000000000000FF000000FF00000000000000 + 000000000000000000000000000000000000000000000000FF000000FF000000 + 0000000000000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000FFFF00FFFFFF0000FFFF0000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + FF000000FF000000FF000000000000000000000000000000FF000000FF000000 + 000000000000000000000000000000000000000000000000FF000000FF000000 + FF00000000000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000FFFFFF00FFFF + FF000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF0000000000000000007F7F7F00000000007F7F7F00000000000000 + 00000000FF000000FF000000FF0000000000000000000000FF000000FF000000 + FF000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF00000000007F7F7F00000000007F7F7F0000000000000000000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF007F7F7F007F7F7F007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF007F7F7F007F7F7F007F7F7F007F7F7F0000FFFF0000FFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000FFFF000000FF0000FFFF00FFFF + FF0000007F00FF000000FF000000000000000000000000000000000000000000 + 0000808080008080800000000000000000000000000000000000FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF007F7F7F007F7F + 7F007F7F7F00FFFFFF00FFFFFF00FFFFFF0000FFFF000000FF000000FF0000FF + FF00FF00000000007F00FF000000000000000000000000000000000000000000 + 0000000000008080800000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00000000000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000FFFF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000FFFF000000FF0000FFFF0000FF + FF00FF00000000007F00FF000000000000000000000000000000000000000000 + 00000000000080808000808080000000000000000000FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F007F7F7F0000FFFF000000FF000000FF000000 + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 00000000000000000000808080000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F00000000007F7F7F007F7F7F0000FFFF000000FF000000FF000000 + FF000000FF0000FFFF0000000000000000000000000000000000000000000000 + 000000000000000000008080800080808000FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF000000000000FFFF000000000000FFFF00000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F00000000007F7F7F007F7F7F0000FFFF000000FF000000FF0000FFFF0000FF + FF000000FF0000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000080808000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000FFFFFF00FFFFFF0000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000007F7F + 7F00000000007F7F7F007F7F7F0000FFFF000000FF0000FFFF007F7F7F000000 + FF0000FFFF000000FF0000FFFF007F7F7F000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 0000000000007F7F7F007F7F7F007F7F7F0000FFFF0000FFFF007F7F7F0000FF + FF0000FFFF0000FFFF0000FFFF007F7F7F000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 0000000000007F7F7F007F7F7F007F7F7F0000FFFF0000FFFF007F7F7F007F7F + 7F007F7F7F0000FFFF000000FF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F007F7F7F007F7F7F0000FFFF007F7F7F007F7F + 7F007F7F7F007F7F7F0000FFFF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F + 7F0000000000000000007F7F7F0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000400000000100010000000000000200000000000000000000 + 000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000FE7F000000000000FC3F000000000000 + FDBF000000000000F99F000000000000FBDF000000000000F3CF000000000000 + F00F000000000000FFFF000000000000FFFF000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000FFDFFFFFFFFFFFFFFFCFFFFFF83FF83F + FFC7FFFFE00FE00F0003FFFFC007C0070001FCFF800380030000FC3F80038003 + 0001FC0F0001000100030003000100010007000000010001000F000300010001 + 001FFC0F00010001007FFC3F8003800300FFFCFF8003800301FFFFFFC007C007 + 03FFFFFFE00FE00FFFFFFFFFF83FF83FFFFFFFFFFFFFFFFFFFFFF83FFFFF801F + C631E00F1FFF0000E223CC47041F0000F0078463000F0000F88FA073000F0000 + FC1F31F900070000FE3F38F900010000FC1F3C7900000000F80F3C3900018000 + F0073C19003F8000E2239C0BFC7FFC00C6318C43FFFFFC01FFFFC467FFFFFC03 + FFFFE00FFFFFFC07FFFFF83FFFFFFFFFFFFFE00F8000FFFFE007E00F0000FFFF + E007E00F0000FFFFE007F00F0000FFFFE007F00F0000F00FE007F80F0000F3CF + E007F0070000FBDFE007F0070000F99FE007F0070000FDBFE007F00FF403FC3F + E007F01FC801FE7FE00FF81FA800FFFFE01FFE1FD800FFFFE03FFF1FB800FFFF + FFFFFF1FFC00FFFFFFFFFFBFFF8CFFFF00000000000000000000000000000000 + 000000000000} + end + object SaveDialog: TSaveDialog + DefaultExt = 'txt' + Filter = 'Text files (*.txt)|*.txt|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 168 + Top = 272 + end +end diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/DependViewMain.pas b/official/1.100/examples/windows/delphitools/dependencyviewer/DependViewMain.pas new file mode 100644 index 0000000..457608b --- /dev/null +++ b/official/1.100/examples/windows/delphitools/dependencyviewer/DependViewMain.pas @@ -0,0 +1,346 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is DependView.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit DependViewMain; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, ToolWin, ComCtrls, ImgList, ActnList, StdActns, ClipBrd, Registry, + ShellAPI; + +const + UM_CHECKPARAMSTR = WM_USER + $100; + +type + TMainForm = class(TForm) + MainMenu: TMainMenu; + CoolBar1: TCoolBar; + ToolBar1: TToolBar; + ToolButton1: TToolButton; + ActionList1: TActionList; + ToolbarImagesList: TImageList; + OpenFileDialog: TOpenDialog; + File1: TMenuItem; + Exit1: TAction; + Exit2: TMenuItem; + Open1: TAction; + Open2: TMenuItem; + N1: TMenuItem; + Window1: TMenuItem; + WindowCascade1: TWindowCascade; + WindowTileHorizontal1: TWindowTileHorizontal; + WindowTileVertical1: TWindowTileVertical; + Cascade1: TMenuItem; + TileHorizontally1: TMenuItem; + TileVertically1: TMenuItem; + ToolButton3: TToolButton; + ToolButton4: TToolButton; + ToolButton5: TToolButton; + ViewImageList: TImageList; + ToolButton7: TToolButton; + Copy1: TAction; + Save1: TAction; + Edit1: TMenuItem; + Copy2: TMenuItem; + Save2: TMenuItem; + ToolButton8: TToolButton; + ToolButton9: TToolButton; + ToolButton10: TToolButton; + SelectAll1: TAction; + Selectall2: TMenuItem; + SaveDialog: TSaveDialog; + Win32Help1: TAction; + ToolButton11: TToolButton; + ToolButton12: TToolButton; + Help1: TMenuItem; + Win32helpkeyword1: TMenuItem; + N2: TMenuItem; + About1: TAction; + About2: TMenuItem; + StatusBar: TStatusBar; + DumpPe1: TAction; + ToolButton2: TToolButton; + N3: TMenuItem; + DumpPEfile1: TMenuItem; + SendMail1: TAction; + Sendamessage1: TMenuItem; + Find1: TAction; + ToolButton6: TToolButton; + N4: TMenuItem; + Findtext1: TMenuItem; + procedure Exit1Execute(Sender: TObject); + procedure Open1Execute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure SelectAll1Update(Sender: TObject); + procedure SelectAll1Execute(Sender: TObject); + procedure Copy1Update(Sender: TObject); + procedure Copy1Execute(Sender: TObject); + procedure Win32Help1Update(Sender: TObject); + procedure Win32Help1Execute(Sender: TObject); + procedure About1Execute(Sender: TObject); + procedure DumpPe1Update(Sender: TObject); + procedure DumpPe1Execute(Sender: TObject); + procedure SendMail1Execute(Sender: TObject); + procedure Find1Update(Sender: TObject); + procedure Find1Execute(Sender: TObject); + procedure CoolBar1Resize(Sender: TObject); + procedure FormShow(Sender: TObject); + private + FPeViewer: Variant; + FPeViewerRegistred: Boolean; + FWin32Help: string; + procedure InvokeWin32Help(const Name: string); + function IsFileViewerChildActive: Boolean; + function IsWin32Help: Boolean; + procedure OnActiveFormChange(Sender: TObject); + procedure UMCheckParamStr(var Message: TMessage); message UM_CHECKPARAMSTR; + procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES; + public + procedure OpenFile(const FileName: TFileName; CheckIfOpen: Boolean); + end; + +var + MainForm: TMainForm; + +implementation + +uses ToolsUtils, FileViewer, JclPeImage, JclRegistry, FindDlg, JclFileUtils; + +{$R *.DFM} + +resourcestring + sNotValidFile = 'This is not a valid PE EXE file'; + +procedure TMainForm.InvokeWin32Help(const Name: string); +var + S: string; +begin + S := PeStripFunctionAW(Name); + WinHelp(Application.Handle, PChar(FWin32Help), HELP_KEY, DWORD(S)); +end; + +procedure TMainForm.OpenFile(const FileName: TFileName; CheckIfOpen: Boolean); +var + I: Integer; +begin + if CheckIfOpen then + begin + for I := 0 to MDIChildCount - 1 do + if MDIChildren[I] is TFileViewerChild and (TFileViewerChild(MDIChildren[I]).FileName = FileName) then + begin + MDIChildren[I].BringToFront; + Exit; + end; + end; + Screen.Cursor := crHourGlass; + try +{ if IsPeExe(FileName) then + begin} + TFileViewerChild.Create(Self).FileName := FileName; + OnActiveFormChange(nil); +{ end else + MessBox(sNotValidFile, MB_ICONINFORMATION);} + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TMainForm.Exit1Execute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.Open1Execute(Sender: TObject); +var + I: Integer; +begin + with OpenFileDialog do + begin + FileName := ''; + if Execute then + for I := 0 to Files.Count - 1 do OpenFile(Files[I], True); + end; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FWin32Help := Win32HelpFileName; + FPeViewerRegistred := IsPeViewerRegistred; + Screen.OnActiveFormChange := OnActiveFormChange; + DragAcceptFiles(Handle, True); +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + DragAcceptFiles(Handle, False); + Screen.OnActiveFormChange := nil; +end; + +procedure TMainForm.OnActiveFormChange(Sender: TObject); +begin + if IsFileViewerChildActive then + StatusBar.Panels[0].Text := TFileViewerChild(ActiveMDIChild).FileName + else + StatusBar.Panels[0].Text := ''; +end; + +procedure TMainForm.SelectAll1Update(Sender: TObject); +begin + TAction(Sender).Enabled := Screen.ActiveControl is TListView; +end; + +procedure TMainForm.SelectAll1Execute(Sender: TObject); +begin + ListViewSelectAll(Screen.ActiveControl as TListView); +end; + +procedure TMainForm.Copy1Update(Sender: TObject); +begin + TAction(Sender).Enabled := Screen.ActiveControl is TListView; +end; + +procedure TMainForm.Copy1Execute(Sender: TObject); +var + SL: TStringList; +begin + SL := TStringList.Create; + Screen.Cursor := crHourGlass; + try + SL.Capacity := 256; + ListViewToStrings(Screen.ActiveControl as TListView, SL, True); + case TAction(Sender).Tag of + 0: Clipboard.AsText := SL.Text; + 1: with SaveDialog do + begin + FileName := ''; + if Execute then SL.SaveToFile(FileName); + end; + end; + finally + Screen.Cursor := crDefault; + SL.Free; + end; +end; + +procedure TMainForm.Win32Help1Update(Sender: TObject); +begin + Win32Help1.Enabled := IsWin32Help and IsFileViewerChildActive and + (TFileViewerChild(ActiveMDIChild).GetWin32Function <> ''); +end; + +procedure TMainForm.Win32Help1Execute(Sender: TObject); +begin + InvokeWin32Help((ActiveMDIChild as TFileViewerChild).GetWin32Function); +end; + +procedure TMainForm.About1Execute(Sender: TObject); +begin + ShowToolsAboutBox; +end; + +function TMainForm.IsFileViewerChildActive: Boolean; +begin + Result := (ActiveMDIChild is TFileViewerChild); +end; + +function TMainForm.IsWin32Help: Boolean; +begin + Result := Length(FWin32Help) > 0; +end; + +procedure TMainForm.DumpPe1Update(Sender: TObject); +begin + DumpPe1.Enabled := FPeViewerRegistred and IsFileViewerChildActive and + (TFileViewerChild(ActiveMDIChild).SelectedFileName <> ''); +end; + +procedure TMainForm.DumpPe1Execute(Sender: TObject); +begin + FPeViewer := CreateOrGetOleObject(PeViewerClassName); + FPeViewer.OpenFile((ActiveMDIChild as TFileViewerChild).SelectedFileName); + FPeViewer.BringToFront; +end; + +procedure TMainForm.SendMail1Execute(Sender: TObject); +begin + SendEmail; +end; + +procedure TMainForm.Find1Update(Sender: TObject); +begin + TAction(Sender).Enabled := TFindTextForm.CanExecuteFind; +end; + +procedure TMainForm.Find1Execute(Sender: TObject); +begin + ShowFindDialog(Screen.ActiveControl as TListView); +end; + +procedure TMainForm.CoolBar1Resize(Sender: TObject); +begin + D4FixCoolBarResizePaint(Sender); +end; + +procedure TMainForm.FormShow(Sender: TObject); +begin + PostMessage(Handle, UM_CHECKPARAMSTR, 0, 0); +end; + +procedure TMainForm.UMCheckParamStr(var Message: TMessage); +var + I: Integer; + FileName: TFileName; +begin + for I := 1 to ParamCount do + begin + FileName := PathGetLongName(ParamStr(I)); + if (FileName <> '') and not (FileName[1] in ['-', '/']) then + OpenFile(FileName, False); + end; +end; + +procedure TMainForm.WMDropFiles(var Message: TWMDropFiles); +var + FilesCount, I: Integer; + FileName: array[0..MAX_PATH] of Char; +begin + FilesCount := DragQueryFile(Message.Drop, MAXDWORD, nil, 0); + for I := 0 to FilesCount - 1 do + begin + if (DragQueryFile(Message.Drop, I, @FileName, SizeOf(FileName)) > 0) and + IsValidPeFile(FileName) then + OpenFile(FileName, True); + end; + DragFinish(Message.Drop); + Message.Result := 0; + Application.BringToFront; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.dfm b/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.dfm new file mode 100644 index 0000000..1b9932a --- /dev/null +++ b/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.dfm @@ -0,0 +1,239 @@ +object FileViewerChild: TFileViewerChild + Left = 205 + Top = 131 + ActiveControl = DependencyTreeView + AutoScroll = False + Caption = 'FileViewerChild' + ClientHeight = 354 + ClientWidth = 576 + Color = clBtnFace + Constraints.MinHeight = 100 + Constraints.MinWidth = 200 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = False + PopupMenu = PopupMenu1 + Position = poDefault + ShowHint = True + Visible = True + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 134 + Top = 0 + Width = 3 + Height = 277 + Cursor = crHSplit + ResizeStyle = rsUpdate + end + object Splitter3: TSplitter + Left = 0 + Top = 277 + Width = 576 + Height = 3 + Cursor = crVSplit + Align = alBottom + ResizeStyle = rsUpdate + end + object DependencyTreeView: TTreeView + Left = 0 + Top = 0 + Width = 134 + Height = 277 + Align = alLeft + ChangeDelay = 50 + HideSelection = False + HotTrack = True + Images = MainForm.ViewImageList + Indent = 19 + ReadOnly = True + ShowRoot = False + StateImages = MainForm.ViewImageList + TabOrder = 0 + OnChange = DependencyTreeViewChange + OnDeletion = DependencyTreeViewDeletion + end + object ListViewsPanel: TPanel + Left = 137 + Top = 0 + Width = 439 + Height = 277 + Align = alClient + BevelOuter = bvNone + FullRepaint = False + TabOrder = 1 + object Splitter2: TSplitter + Left = 0 + Top = 150 + Width = 439 + Height = 3 + Cursor = crVSplit + Align = alTop + ResizeStyle = rsUpdate + end + object ImportListView: TListView + Left = 0 + Top = 153 + Width = 439 + Height = 124 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 250 + end + item + Alignment = taRightJustify + Caption = 'Ordinal' + Width = 60 + end + item + Alignment = taRightJustify + Caption = 'Hint' + end + item + Caption = 'Module' + end> + HideSelection = False + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.ViewImageList + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = ImportListViewColumnClick + OnData = ImportListViewData + OnDblClick = ExportListViewDblClick + end + object ExportListView: TListView + Left = 0 + Top = 0 + Width = 439 + Height = 150 + Align = alTop + Columns = < + item + Caption = 'Name' + Width = 250 + end + item + Alignment = taRightJustify + Caption = 'Ordinal' + end + item + Alignment = taRightJustify + Caption = 'Hint' + end + item + Caption = 'Address' + Width = 70 + end> + HideSelection = False + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.ViewImageList + TabOrder = 1 + ViewStyle = vsReport + OnColumnClick = ExportListViewColumnClick + OnData = ExportListViewData + OnDblClick = ExportListViewDblClick + end + end + object ModulesListView: TListView + Left = 0 + Top = 280 + Width = 576 + Height = 74 + Align = alBottom + Columns = < + item + Caption = 'Module' + Width = 100 + end + item + Caption = 'Date and time' + Width = 120 + end + item + Alignment = taRightJustify + Caption = 'Size' + Width = 70 + end + item + Caption = 'Subsystem' + Width = 65 + end + item + Caption = 'Base address' + Width = 80 + end + item + Caption = 'File version' + Width = 80 + end + item + Caption = 'Product version' + Width = 90 + end + item + Caption = 'Img ver.' + end + item + Caption = 'Linker' + end + item + Caption = 'OS' + end + item + Caption = 'Subsys ver.' + end + item + Caption = 'Description' + Width = 250 + end> + ColumnClick = False + GridLines = True + HideSelection = False + MultiSelect = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.ViewImageList + TabOrder = 2 + ViewStyle = vsReport + OnDblClick = ModulesListViewDblClick + OnInfoTip = ModulesListViewInfoTip + end + object PopupMenu1: TPopupMenu + Images = MainForm.ToolbarImagesList + Left = 8 + Top = 312 + object Copy1: TMenuItem + Action = MainForm.Copy1 + end + object Save1: TMenuItem + Action = MainForm.Save1 + end + object N1: TMenuItem + Caption = '-' + end + object Selectall1: TMenuItem + Action = MainForm.SelectAll1 + end + object DumpPEfile1: TMenuItem + Action = MainForm.DumpPe1 + end + object Win32helpkeyword1: TMenuItem + Action = MainForm.Win32Help1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.pas b/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.pas new file mode 100644 index 0000000..f9f7960 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/dependencyviewer/FileViewer.pas @@ -0,0 +1,663 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is FileViewer.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit FileViewer; + +{$I JCL.INC} + +{.$DEFINE UsePeImagesCache} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ExtCtrls, Menus, JclPeImage; + +type + TFileViewerChild = class(TForm) + DependencyTreeView: TTreeView; + Splitter1: TSplitter; + ListViewsPanel: TPanel; + Splitter2: TSplitter; + ImportListView: TListView; + ExportListView: TListView; + PopupMenu1: TPopupMenu; + Copy1: TMenuItem; + Save1: TMenuItem; + N1: TMenuItem; + Selectall1: TMenuItem; + Win32helpkeyword1: TMenuItem; + ModulesListView: TListView; + Splitter3: TSplitter; + DumpPEfile1: TMenuItem; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure ExportListViewData(Sender: TObject; Item: TListItem); + procedure ImportListViewData(Sender: TObject; Item: TListItem); + procedure ExportListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure ImportListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure FormDestroy(Sender: TObject); + procedure DependencyTreeViewChange(Sender: TObject; Node: TTreeNode); + procedure DependencyTreeViewDeletion(Sender: TObject; Node: TTreeNode); + procedure ModulesListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: String); + procedure ExportListViewDblClick(Sender: TObject); + procedure ModulesListViewDblClick(Sender: TObject); + private + FAnyRootError: Boolean; + FBasePath: string; + FCurrentImportDirIndex: Integer; + FFileName: TFileName; + FModulesList: TStringList; + FExportViewImage, FParentImportViewImage: TJclPeImage; + FPeImagesCache: TJclPeImagesCache; + function GetModuleName: string; + procedure SetFileName(const Value: TFileName); + procedure ExportListViewSort; + function ModuleToFileName(const ModuleName: string): TFileName; + procedure ImportListViewSort; + procedure InitTree; + function IsListViewActiveAndFocused( ListView: TListView): Boolean; + procedure UpdateExportView(Node: TTreeNode); + procedure UpdateModulesView; + procedure UpdateParentImportView(Node: TTreeNode); + class procedure UpdateSortData(Column: TListColumn); + function GetSelectedFileName: TFileName; + public + function GetWin32Function: string; + property FileName: TFileName read FFileName write SetFileName; + property ModuleName: string read GetModuleName; + property SelectedFileName: TFileName read GetSelectedFileName; + end; + +var + FileViewerChild: TFileViewerChild; + +implementation + +uses DependViewMain, ToolsUtils, JclSysInfo, JclStrings, JclFileUtils; + +{$R *.DFM} + +type + TPeModuleState = ( + modNoErrors, // Normal module with no errors. + modFwdNoErrors, // Forwarded module with no errors. + modDupNoErrors, // Duplicate module with no errors. + modDupFwdNoErrors, // Forwarded duplicate module with no errors. + modExportMissing, // Module with one or more missing export functions + modFwdExportMissing, // Forwarded module with one or more missing export functions + modDupExportMissing, // Duplicate module with one or more missing export functions + modDupFwdExportMissing, // Forwarded duplicate module with one or more missing export functions + modMissing, // Missing module. + modFwdMissing, // Missing forwarded module. + modInvalid, // Invalid module. + modFwdInvalid, // Invalid forwarded module. + modRoot // Root node. + ); + + TPeModuleImageInfo = record + ImageIndex, StateIndex: Integer; + end; + + PPeModuleNodeData = ^TPeModuleNodeData; + TPeModuleNodeData = record + State: TPeModuleState; + ImportDirectoryIndex: Integer; + end; + +const + imgModule = 0; + imgDupModule = 1; + imgModExportMissing = 2; + imgDupExportMissing = 3; + imgMissingModule = 4; + imgInvalidModule = 5; + imgForwardFlag = 6; + imgRoot = 7; + imgExport = 8; + imgFwdExport = 9; + imgImport = 10; + imgUnresolvedImport = 11; + imgSortAsceding = 12; + imgSortDesceding = 3; + + ErrorModules = [modMissing, modFwdMissing, modInvalid, modFwdInvalid]; + MissingExportModules = [modExportMissing, modFwdExportMissing, modDupExportMissing, + modDupFwdExportMissing, modMissing, modFwdMissing, modInvalid, modFwdInvalid]; + ForwardedModules = [modFwdNoErrors, modDupFwdNoErrors, modFwdExportMissing, + modDupFwdExportMissing]; + + ModuleImages: array[TPeModuleState] of TPeModuleImageInfo = ( + (ImageIndex: imgModule; StateIndex: -1), + (ImageIndex: imgModule; StateIndex: imgForwardFlag), + (ImageIndex: imgDupModule; StateIndex: -1), + (ImageIndex: imgDupModule; StateIndex: imgForwardFlag), + (ImageIndex: imgModExportMissing; StateIndex: -1), + (ImageIndex: imgModExportMissing; StateIndex: imgForwardFlag), + (ImageIndex: imgDupExportMissing; StateIndex: -1), + (ImageIndex: imgDupExportMissing; StateIndex: imgForwardFlag), + (ImageIndex: imgMissingModule; StateIndex: -1), + (ImageIndex: imgMissingModule; StateIndex: imgForwardFlag), + (ImageIndex: imgInvalidModule; StateIndex: -1), + (ImageIndex: imgInvalidModule; StateIndex: imgForwardFlag), + (ImageIndex: imgRoot; StateIndex: -1) + ); + +{ TFileViewerChild } + +procedure TFileViewerChild.FormCreate(Sender: TObject); +begin + FModulesList := TStringList.Create; + FModulesList.Sorted := True; + FModulesList.Duplicates := dupIgnore; + FExportViewImage := TJclPeImage.Create; + FPeImagesCache := TJclPeImagesCache.Create; +{$IFNDEF UsePeImagesCache} + FParentImportViewImage := TJclPeImage.Create; +{$ENDIF} + FCurrentImportDirIndex := -1; + ExportListView.Height := ListViewsPanel.ClientHeight div 2; + ImportListView.Tag := $100; + UpdateSortData(ImportListView.Columns[0]); + ExportListView.Tag := $100; + UpdateSortData(ExportListView.Columns[0]); + ModulesListView.Columns[0].Width := ColumnTextWidth; +end; + +procedure TFileViewerChild.FormDestroy(Sender: TObject); +begin + FModulesList.Free; + FExportViewImage.Free; + FPeImagesCache.Free; +{$IFNDEF UsePeImagesCache} + FParentImportViewImage.Free; +{$ENDIF} +end; + +procedure TFileViewerChild.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Fix_ListViewBeforeClose(Self); + Action := caFree; +end; + +function TFileViewerChild.GetModuleName: string; +begin + Result := ExtractFileName(FFileName); +end; + +procedure TFileViewerChild.InitTree; +var + RootNode: TTreeNode; + + procedure SetNodeState(Node: TTreeNode; State: TPeModuleState); +var + I: Integer; +begin + PPeModuleNodeData(Node.Data)^.State := State; + Node.ImageIndex := ModuleImages[State].ImageIndex; + Node.SelectedIndex := ModuleImages[State].ImageIndex; + Node.StateIndex := ModuleImages[State].StateIndex; + if State in (MissingExportModules + ErrorModules) then + begin + if Node.Parent = RootNode then FAnyRootError := True; + I := FModulesList.IndexOf(Node.Text); + Assert(I >= 0); + FModulesList.Objects[I] := Pointer(State); + end; +end; + + function AddNode(Node: TTreeNode; const Text: string; State: TPeModuleState): TTreeNode; +var + Data: PPeModuleNodeData; +begin + Result := DependencyTreeView.Items.AddChild(Node, Text); + New(Data); + Result.Data := Data; + SetNodeState(Result, State); +end; + + procedure ScanModule(const ModuleName: string; Node: TTreeNode; Forwarded, ErrorsOnly: Boolean); +var + ExeImage: TJclPeImage; + I, Found: Integer; + S: string; + TempNode: TTreeNode; + AddedNodes: array of TTreeNode; + AddedNodesCount: Integer; +begin + ExeImage := FPeImagesCache[ModuleToFilename(ModuleName)]; + case ExeImage.Status of + stOk: + if not ErrorsOnly then + begin + with ExeImage.ImportList do + begin + SetLength(AddedNodes, Count); + AddedNodesCount := 0; + CheckImports(FPeImagesCache); + SortList(ilName); + for I := 0 to Count - 1 do + begin + S := Items[I].Name; + Found := FModulesList.IndexOf(S); + if Found = -1 then + begin + Found := FModulesList.Add(S); + FModulesList.Objects[Found] := Pointer(modNoErrors); + if Items[I].TotalResolveCheck = icUnresolved then + TempNode := AddNode(Node, S, modExportMissing) + else + TempNode := AddNode(Node, S, modNoErrors); + AddedNodes[AddedNodesCount] := TempNode; + Inc(AddedNodesCount); + end else + begin + if Items[I].TotalResolveCheck = icUnresolved then + TempNode := AddNode(Node, S, modDupExportMissing) + else + TempNode := AddNode(Node, S, modDupNoErrors); + ScanModule(TempNode.Text, TempNode, False, True); // ! + end; + PPeModuleNodeData(TempNode.Data)^.ImportDirectoryIndex := Items[I].ImportDirectoryIndex; + end; + end; + for I := 0 to AddedNodesCount - 1 do + ScanModule(AddedNodes[I].Text, AddedNodes[I], False, False); + with ExeImage.ExportList do + begin + CheckForwards(FPeImagesCache); + for I := 0 to ForwardedLibsList.Count - 1 do + begin + S := ForwardedLibsList[I]; + Found := FModulesList.IndexOf(S); + if Found = -1 then + begin + Found := FModulesList.Add(S); + FModulesList.Objects[Found] := Pointer(modNoErrors); + if TJclPeResolveCheck(ForwardedLibsList.Objects[I]) = icUnresolved then + AddNode(Node, S, modFwdExportMissing) + else + AddNode(Node, S, modFwdNoErrors); + end else + begin + if TJclPeResolveCheck(ForwardedLibsList.Objects[I]) = icUnresolved then + TempNode := AddNode(Node, S, modDupFwdExportMissing) + else + TempNode := AddNode(Node, S, modDupFwdNoErrors); + ScanModule(TempNode.Text, TempNode, True, True); // ! + end; + end; + end; + end; + stNotFound: + if Forwarded then SetNodeState(Node, modFwdMissing) else SetNodeState(Node, modMissing); + else + if Forwarded then SetNodeState(Node, modFwdInvalid) else SetNodeState(Node, modInvalid); + end; +end; + +begin + with DependencyTreeView do + begin + Items.BeginUpdate; + try + Items.Clear; + Screen.Cursor := crHourGlass; + RootNode := AddNode(nil, ModuleName, modRoot); + FModulesList.AddObject(ModuleName, Pointer(modRoot)); + ScanModule(FFileName, RootNode, False, False); + RootNode.Expand(False); + Selected := RootNode; + finally + Items.EndUpdate; + Screen.Cursor := crDefault; + end; + end; + UpdateModulesView; +{$IFNDEF UsePeImagesCache} + FPeImagesCache.Clear; +{$ENDIF} +end; + +procedure TFileViewerChild.SetFileName(const Value: TFileName); +begin + FAnyRootError := False; + FFileName := Value; + FBasePath := ExtractFilePath(FFileName); + Caption := ModuleName; + InitTree; +end; + +class procedure TFileViewerChild.UpdateSortData(Column: TListColumn); +var + ListView: TListView; + I: Integer; +begin + ListView := TListView(TListColumns(Column.Collection).Owner); + ListView.Columns.BeginUpdate; + with ListView.Columns do + for I := 0 to Count - 1 do + Items[I].ImageIndex := -1; + if ListView.Tag and $FF = Column.Index then + ListView.Tag := ListView.Tag xor $100 + else + ListView.Tag := Column.Index; + if ListView.Tag and $100 = 0 then + Column.ImageIndex := imgSortAsceding + else + Column.ImageIndex := imgSortDesceding; + ListView.Columns.EndUpdate; +end; + +function TFileViewerChild.IsListViewActiveAndFocused( ListView: TListView): Boolean; +begin + Result := (ActiveControl = ListView) and (ListView.ItemFocused <> nil); +end; + +function TFileViewerChild.GetWin32Function: String; +begin + Result := ''; + if IsListViewActiveAndFocused(ImportListView) then + Result := ImportListView.ItemFocused.Caption + else + if IsListViewActiveAndFocused(ExportListView) then + Result := ExportListView.ItemFocused.Caption + else + Result := ''; + if Pos('@', Result) > 0 then + Result := '' + else + Result := StrRemoveChars(Result, ['[', ']']); +end; + +procedure TFileViewerChild.ExportListViewData(Sender: TObject; + Item: TListItem); +begin + with Item, FExportViewImage.ExportList[Item.Index] do + begin + Caption := Name; + SubItems.Add(Format('%d', [Ordinal])); + SubItems.Add(Format('%d', [Hint])); + SubItems.Add(AddressOrForwardStr); + if IsForwarded then ImageIndex := imgFwdExport else ImageIndex := imgExport; + end; +end; + +procedure TFileViewerChild.ImportListViewData(Sender: TObject; Item: TListItem); +var + ViewItem: TJclPeImportFuncItem; +begin + if FCurrentImportDirIndex = -1 then + ViewItem := FParentImportViewImage.ImportList.AllItems[Item.Index] + else + ViewItem := FParentImportViewImage.ImportList[FCurrentImportDirIndex][Item.Index]; + with Item, ViewItem do + begin + if IndirectImportName then + Caption := Format('[%s]', [Name]) + else + Caption := Name; + if Ordinal <> 0 then + begin + SubItems.Add(Format('%d', [Ordinal])); + SubItems.Add(''); + end else + begin + SubItems.Add(''); + SubItems.Add(Format('%d', [Hint])); + end; + if FCurrentImportDirIndex = -1 then SubItems.Add(ImportLib.Name); + case ResolveCheck of + icUnresolved: ImageIndex := imgUnresolvedImport; + icResolved, icNotChecked: ImageIndex := imgImport; + end; + end; +end; + +procedure TFileViewerChild.ExportListViewColumnClick(Sender: TObject; Column: TListColumn); +begin + UpdateSortData(Column); + ExportListViewSort; +end; + +procedure TFileViewerChild.ImportListViewColumnClick(Sender: TObject; Column: TListColumn); +begin + UpdateSortData(Column); + ImportListViewSort; +end; + +procedure TFileViewerChild.UpdateExportView(Node: TTreeNode); +begin + with ExportListView.Items do + begin + BeginUpdate; + if PPeModuleNodeData(Node.Data)^.State in ErrorModules then + FExportViewImage.FileName := '' + else + FExportViewImage.FileName := ModuleToFilename(Node.Text); + Count := FExportViewImage.ExportList.Count; + ExportListViewSort; + EndUpdate; + end; +end; + +procedure TFileViewerChild.UpdateParentImportView(Node: TTreeNode); +var + ParentFileName: TFileName; + NodeState: TPeModuleState; + + procedure ShowModuleColumn(B: Boolean); +begin + with ImportListView do + if (B xor (Columns.Count <> 3)) then + begin + Columns.BeginUpdate; + if B then Columns.Add.Caption := 'Module' else + begin + Columns[3].Free; + if Tag and $FF = 3 then + begin + Tag := $100; + UpdateSortData(Columns[0]); + ImportListViewSort; + end; + end; + Columns.EndUpdate; + end; +end; + +begin + with ImportListView.Items do + begin + BeginUpdate; + if Node.Parent = nil then + ParentFileName := Node.Text + else + ParentFileName := Node.Parent.Text; + ParentFileName := ModuleToFilename(ParentFileName); + NodeState := PPeModuleNodeData(Node.Data)^.State; +{$IFDEF UsePeImagesCache} + FParentImportViewImage := FPeImagesCache[ParentFileName]; + FParentImportViewImage.ImportList.SortList(ilIndex); +{$ELSE} + FParentImportViewImage.FileName := ParentFileName; +{$ENDIF} + if (NodeState in MissingExportModules + ErrorModules) or FAnyRootError then + FParentImportViewImage.ImportList.CheckImports; + FParentImportViewImage.TryGetNamesForOrdinalImports; + if NodeState in ForwardedModules then + begin + ShowModuleColumn(False); + FCurrentImportDirIndex := -1; + FParentImportViewImage.ImportList.FilterModuleName := Node.Text; + Count := FParentImportViewImage.ImportList.AllItemCount; + end else + if Node.Parent = nil then + begin + ShowModuleColumn(True); + FCurrentImportDirIndex := -1; + FParentImportViewImage.ImportList.FilterModuleName := ''; + Count := FParentImportViewImage.ImportList.AllItemCount; + end else + begin + ShowModuleColumn(False); + FCurrentImportDirIndex := PPeModuleNodeData(Node.Data)^.ImportDirectoryIndex; + Count := FParentImportViewImage.ImportList[FCurrentImportDirIndex].Count; + end; + ImportListViewSort; + EndUpdate; + end; +end; + +procedure TFileViewerChild.DependencyTreeViewChange(Sender: TObject; Node: TTreeNode); +begin + UpdateExportView(Node); + UpdateParentImportView(Node); +end; + +procedure TFileViewerChild.DependencyTreeViewDeletion(Sender: TObject; Node: TTreeNode); +begin + Dispose(Node.Data); // PPeModuleNodeData +end; + +procedure TFileViewerChild.ImportListViewSort; +const + MapIndexToSortType: array[0..3] of TJclPeImportSort = (isName, isOrdinal, isHint, isLibImport); +begin + with ImportListView do + begin + if FCurrentImportDirIndex = -1 then + FParentImportViewImage.ImportList.SortAllItemsList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0) + else + FParentImportViewImage.ImportList[FCurrentImportDirIndex].SortList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0); + Invalidate; + end; +end; + +procedure TFileViewerChild.ExportListViewSort; +const + MapIndexToSortType: array[0..3] of TJclPeExportSort = + (esName, esOrdinal, esHint, esAddrOrFwd); +begin + with ExportListView do + begin + FExportViewImage.ExportList.SortList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0); + Invalidate; + end; +end; + +procedure TFileViewerChild.UpdateModulesView; +var + I: Integer; + ExeImage: TJclPeImage; + VI: TJclFileVersionInfo; +begin + with ModulesListView.Items do + begin + BeginUpdate; + try + Clear; + for I := 0 to FModulesList.Count - 1 do + with Add, FModulesList do + begin + ExeImage := FPeImagesCache.Images[ModuleToFilename(Strings[I])]; + Caption := ExtractFileName(ExeImage.FileName); + Data := Objects[I]; + if ExeImage.Status = stOk then + begin + VI := ExeImage.VersionInfo; + with ExeImage.FileProperties, SubItems do + begin + Add(FormatDateTime('ddddd tt', LastWriteTime)); + Add(Format('%.0n', [IntToExtended(Size)])); + end; + with ExeImage, SubItems do + begin + Add(HeaderValues[JclPeHeader_Subsystem]); + Add(HeaderValues[JclPeHeader_ImageBase]); + if Assigned(VI) then Add(VI.FileVersion) else Add(''); + if Assigned(VI) then Add(VI.ProductVersion) else Add(''); + Add(HeaderValues[JclPeHeader_ImageVersion]); + Add(HeaderValues[JclPeHeader_LinkerVersion]); + Add(HeaderValues[JclPeHeader_OperatingSystemVersion]); + Add(HeaderValues[JclPeHeader_SubsystemVersion]); + if Assigned(VI) then Add(VI.FileDescription) else Add(''); + end; + end; + ImageIndex := ModuleImages[TPeModuleState(Objects[I])].ImageIndex; + end; + finally + EndUpdate; + end; + end; +end; + +procedure TFileViewerChild.ModulesListViewInfoTip(Sender: TObject; Item: TListItem; var InfoTip: String); +begin + with Item.SubItems do + if Count > 10 then + InfoTip := Strings[5] + #13#10 + Strings[10] + else + InfoTip := ''; +end; + +function TFileViewerChild.ModuleToFileName(const ModuleName: string): TFileName; +begin + Result := TJclPeImage.ExpandBySearchPath(ModuleName, FBasePath); +end; + +function TFileViewerChild.GetSelectedFileName: TFileName; +var + S: string; +begin + S := ''; + if ActiveControl = DependencyTreeView then + begin + with DependencyTreeView do + if Selected <> nil then + if Selected.Level = 0 then S := FFileName else + S := Selected.Text; + end else + if Activecontrol = ModulesListView then + with ModulesListView do + if Selected <> nil then + S := Selected.Caption; + Result := ModuleToFileName(S); +end; + +procedure TFileViewerChild.ExportListViewDblClick(Sender: TObject); +begin + MainForm.Win32Help1.Execute; +end; + +procedure TFileViewerChild.ModulesListViewDblClick(Sender: TObject); +begin + MainForm.DumpPe1.Execute; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeDump.dfm b/official/1.100/examples/windows/delphitools/peviewer/PeDump.dfm new file mode 100644 index 0000000..54f3017 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeDump.dfm @@ -0,0 +1,499 @@ +object PeDumpChild: TPeDumpChild + Left = 195 + Top = 152 + AutoScroll = False + Caption = 'PeDumpChild' + ClientHeight = 347 + ClientWidth = 592 + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 250 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = False + PopupMenu = PopupMenu1 + Position = poDefault + ShowHint = True + Visible = True + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 121 + Top = 0 + Width = 3 + Height = 347 + Cursor = crHSplit + ResizeStyle = rsUpdate + end + object SectionTreeView: TTreeView + Left = 0 + Top = 0 + Width = 121 + Height = 347 + Align = alLeft + HideSelection = False + HotTrack = True + Images = MainForm.IconImageList + Indent = 19 + ReadOnly = True + TabOrder = 0 + OnChange = SectionTreeViewChange + OnDblClick = SectionTreeViewDblClick + OnExpanding = SectionTreeViewExpanding + end + object PageControl1: TPageControl + Left = 124 + Top = 0 + Width = 468 + Height = 347 + ActivePage = ItemsTab + Align = alClient + TabOrder = 1 + TabStop = False + object ItemsTab: TTabSheet + Caption = 'ItemsTab' + object ItemsListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Item' + Width = 200 + end + item + Caption = 'Value' + Width = 100 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = ItemsListViewData + end + end + object DirectoryTab: TTabSheet + Caption = 'DirectoryTab' + ImageIndex = 1 + object DirectoryListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Directory' + Width = 120 + end + item + Caption = 'RVA' + Width = 80 + end + item + Alignment = taRightJustify + Caption = 'Size' + Width = 80 + end + item + Alignment = taRightJustify + Caption = 'Percent of file' + Width = 80 + end + item + Caption = 'Section' + Width = 70 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnCustomDrawItem = DirectoryListViewCustomDrawItem + OnData = DirectoryListViewData + end + end + object ImportTab: TTabSheet + Caption = 'ImportTab' + ImageIndex = 2 + object ImportListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 300 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 230 + end + item + Caption = 'Ordinal' + Width = 60 + end + item + Caption = 'Hint' + end + item + Caption = 'Module' + Width = 90 + end> + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = ImportListViewColumnClick + OnData = ImportListViewData + OnDblClick = ImportListViewDblClick + end + object ImportStatusBar: TStatusBar + Left = 0 + Top = 300 + Width = 460 + Height = 19 + Panels = < + item + Width = 90 + end + item + Width = 90 + end + item + Width = 50 + end> + SimplePanel = False + end + end + object ExportTab: TTabSheet + Caption = 'ExportTab' + ImageIndex = 3 + object ExportListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 300 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 250 + end + item + Alignment = taRightJustify + Caption = 'Ordinal' + end + item + Alignment = taRightJustify + Caption = 'Hint' + end + item + Caption = 'Address' + Width = 70 + end + item + Caption = 'Forwarded' + Width = 100 + end + item + Caption = 'Section' + end> + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = ExportListViewColumnClick + OnData = ExportListViewData + OnDblClick = ImportListViewDblClick + end + object ExportStatusBar: TStatusBar + Left = 0 + Top = 300 + Width = 460 + Height = 19 + Panels = < + item + Width = 90 + end + item + Width = 90 + end + item + Width = 100 + end + item + Width = 50 + end> + SimplePanel = False + end + end + object ResourceTab: TTabSheet + Caption = 'ResourceTab' + ImageIndex = 4 + object ResourceListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Names' + Width = 200 + end + item + Caption = 'Offset' + Width = 100 + end + item + Caption = 'Size' + end + item + Caption = 'Languages' + Width = 70 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = ResourceListViewData + end + end + object SectionTab: TTabSheet + Caption = 'SectionTab' + ImageIndex = 5 + object SectionListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Section' + Width = 70 + end + item + Caption = 'VirtSize' + Width = 70 + end + item + Caption = 'RVA' + Width = 70 + end + item + Caption = 'PhysSize' + Width = 70 + end + item + Caption = 'PhysOfs' + Width = 70 + end + item + Caption = 'Flags' + Width = 70 + end + item + Caption = 'Info' + end + item + Alignment = taRightJustify + Caption = 'Percent of file' + Width = 79 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = SectionListViewData + end + end + object ResourceDirTab: TTabSheet + Caption = 'ResourceDirTab' + ImageIndex = 6 + object ResourceDirListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Type' + Width = 200 + end + item + Caption = 'Count' + Width = 100 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = ResourceDirListViewData + end + end + object RelocTab: TTabSheet + Caption = 'RelocTab' + ImageIndex = 7 + object RelocListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 300 + Align = alClient + Columns = < + item + Caption = 'Address' + Width = 200 + end + item + Caption = 'Type' + Width = 100 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = RelocListViewData + end + object RelocStatusBar: TStatusBar + Left = 0 + Top = 300 + Width = 460 + Height = 19 + Panels = < + item + Width = 100 + end + item + Width = 50 + end> + SimplePanel = False + end + end + object DebugTab: TTabSheet + Caption = 'DebugTab' + ImageIndex = 8 + object DebugListView: TListView + Left = 0 + Top = 0 + Width = 460 + Height = 319 + Align = alClient + Columns = < + item + Caption = 'Type' + Width = 100 + end + item + Caption = 'Size' + Width = 70 + end + item + Caption = 'RVA' + Width = 70 + end + item + Caption = 'FilePtr' + Width = 70 + end + item + Caption = 'Version' + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = DebugListViewData + end + end + end + object PopupMenu1: TPopupMenu + Images = MainForm.ToolbarImagesList + Left = 16 + Top = 312 + object Copytoclipboard1: TMenuItem + Action = MainForm.Copy1 + end + object Selectall1: TMenuItem + Action = MainForm.SelectAll1 + end + object N1: TMenuItem + Caption = '-' + end + object Openlibrary1: TMenuItem + Action = MainForm.OpenLibrary1 + end + object FindinWin32APIhelp1: TMenuItem + Action = MainForm.InvokeHelp1 + Default = True + end + end +end diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeDump.pas b/official/1.100/examples/windows/delphitools/peviewer/PeDump.pas new file mode 100644 index 0000000..ad6f776 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeDump.pas @@ -0,0 +1,943 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeDump.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2007-02-04 19:37:27 +0100 (dim., 04 févr. 2007) $ } +{ } +{**************************************************************************************************} + +unit PeDump; + +{$I jcl.inc} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + JclPeImage, ComCtrls, ExtCtrls, Menus; + +type + TPeDumpViewCategory = (vcHeader, vcDirectory, vcSection, vcLoadConfig, + vcImport, vcExport, vcResource, vcRelocation, vcDebug); + + TPeDumpChild = class(TForm) + SectionTreeView: TTreeView; + Splitter1: TSplitter; + PageControl1: TPageControl; + ItemsTab: TTabSheet; + DirectoryTab: TTabSheet; + ItemsListView: TListView; + DirectoryListView: TListView; + ImportTab: TTabSheet; + ImportListView: TListView; + ExportTab: TTabSheet; + ExportListView: TListView; + PopupMenu1: TPopupMenu; + Copytoclipboard1: TMenuItem; + Selectall1: TMenuItem; + N1: TMenuItem; + Openlibrary1: TMenuItem; + FindinWin32APIhelp1: TMenuItem; + ResourceTab: TTabSheet; + ResourceListView: TListView; + SectionTab: TTabSheet; + SectionListView: TListView; + ResourceDirTab: TTabSheet; + ResourceDirListView: TListView; + ExportStatusBar: TStatusBar; + ImportStatusBar: TStatusBar; + RelocTab: TTabSheet; + RelocListView: TListView; + RelocStatusBar: TStatusBar; + DebugTab: TTabSheet; + DebugListView: TListView; + procedure FormCreate(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure ItemsListViewData(Sender: TObject; Item: TListItem); + procedure SectionTreeViewChange(Sender: TObject; Node: TTreeNode); + procedure DirectoryListViewData(Sender: TObject; Item: TListItem); + procedure ImportListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure ImportListViewData(Sender: TObject; Item: TListItem); + procedure FormDestroy(Sender: TObject); + procedure ExportListViewData(Sender: TObject; Item: TListItem); + procedure ExportListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure SectionTreeViewDblClick(Sender: TObject); + procedure SectionListViewData(Sender: TObject; Item: TListItem); + procedure ResourceListViewData(Sender: TObject; Item: TListItem); + procedure ResourceDirListViewData(Sender: TObject; Item: TListItem); + procedure ImportListViewDblClick(Sender: TObject); + procedure DirectoryListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure SectionTreeViewExpanding(Sender: TObject; Node: TTreeNode; + var AllowExpansion: Boolean); + procedure RelocListViewData(Sender: TObject; Item: TListItem); + procedure DebugListViewData(Sender: TObject; Item: TListItem); + procedure ItemsListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: String); + private + FCurrentResourceDirectory: TJclPeResourceItem; + FCurrentImportIndex: Integer; + FCurrentRelocationIndex: Integer; + FOriginalPageControlWndProc: TWndMethod; + FPeImage: TJclPeImage; + FGroupImports: Boolean; + FUpdatingView: Boolean; + FUnmangleNames: Boolean; + function GetFileName: TFileName; + function GetHasDirectory(const Directory: DWORD): Boolean; + function GetNodeCategory(Node: TTreeNode): TPeDumpViewCategory; + procedure ExportListViewSort; + procedure ImportListViewSort; + function IsListViewActiveAndFocused(ListView: TListView): Boolean; + procedure PageControlWndProc(var Message: TMessage); + procedure UpdateView; + procedure UpdateImportView(Node: TTreeNode); + procedure UpdateRelocationView(Node: TTreeNode); + procedure UpdateResourceDir; + procedure UpdateResourceView(Directory: TJclPeResourceItem); + class procedure UpdateSortData(Column: TListColumn); + procedure SetGroupImports(const Value: Boolean); + procedure SetUnmangleNames(const Value: Boolean); + function FunctionName(const Name: string): string; + function HeadersRemark(HeaderItem: TJclPeHeader): string; + public + constructor CreateEx(AOwner: TComponent; APeImage: TJclPeImage); + function ActiveLibName: string; + function ActiveWin32Function: string; + property FileName: TFileName read GetFileName; + property HasDirectory[const Directory: DWORD]: Boolean read GetHasDirectory; + property GroupImports: Boolean read FGroupImports write SetGroupImports; + property PeImage: TJclPeImage read FPeImage; + property UnmangleNames: Boolean read FUnmangleNames write SetUnmangleNames; + end; + +var + PeDumpChild: TPeDumpChild; + +implementation + +{$R *.DFM} + +uses + CommCtrl, PeViewerMain, ToolsUtils, PeResource, JclStrings, JclWin32; + +resourcestring + RsHeader = 'Header'; + RsDirectory = 'Directory'; + RsSection = 'Sections'; + RsLoadConfig = 'Load config'; + RsImport = 'Imports'; + RsExport = 'Exports'; + RsRelocation = 'Relocations'; + RsResource = 'Resources'; + RsDebug = 'Debug'; + RsNumberOfNames = 'Names: %d'; + RsNumberOfFunctions = 'Functions: %d'; + RsLinkerProducer = 'Linker: %s'; + RsOrdinalBase = 'Ordinal base: %d'; + RsAddresses = 'Addresses: %d'; + +function GetCategoryName(Category: TPeDumpViewCategory): string; +begin + case Category of + vcHeader: Result := RsHeader; + vcDirectory: Result := RsDirectory; + vcSection: Result := RsSection; + vcLoadConfig: Result := RsLoadConfig; + vcImport: Result := RsImport; + vcExport: Result := RsExport; + vcResource: Result := RsResource; + vcRelocation: Result := RsRelocation; + vcDebug: Result := RsDebug; + end; +end; + +function ImageIndexFromImportKind(Kind: TJclPeImportKind): Integer; +begin + case Kind of + ikImport: + Result := icoImports; + ikDelayImport: + Result := icoDelayImport; + ikBoundImport: + Result := icoBoundImport; + else + Result := 0; + end; +end; + +{ TPeDumpChild } + +function TPeDumpChild.ActiveLibName: string; +begin + with SectionTreeView do + if (Selected <> nil) and (Selected.Level = 1) and + (TPeDumpViewCategory(Selected.Parent.Data) = vcImport) then + Result := FPeImage.ExpandBySearchPath(Selected.Text, ExtractFilePath(FileName)) + else + Result := ''; +end; + +function TPeDumpChild.ActiveWin32Function: string; +begin + Result := ''; + if IsListViewActiveAndFocused(ImportListView) then + Result := ImportListView.ItemFocused.Caption + else + if IsListViewActiveAndFocused(ExportListView) then + Result := ExportListView.ItemFocused.Caption + else + Result := ''; + if Pos('@', Result) > 0 then + Result := '' + else + Result := StrRemoveChars(Result, ['[', ']']); +end; + +constructor TPeDumpChild.CreateEx(AOwner: TComponent; APeImage: TJclPeImage); +begin + inherited Create(AOwner); + FPeImage := APeImage; + Caption := ExtractFileName(FileName); + {$IFDEF COMPILER5_UP} + ItemsListView.OnInfoTip := ItemsListViewInfoTip; + {$ENDIF COMPILER5_UP} +end; + +function TPeDumpChild.GetFileName: TFileName; +begin + if FPeImage = nil then Result := '' else Result := FPeImage.FileName; +end; + +function TPeDumpChild.GetHasDirectory(const Directory: DWORD): Boolean; +begin + if FPeImage = nil then + Result := False + else + Result := FPeImage.DirectoryExists[Directory]; +end; + +procedure TPeDumpChild.PageControlWndProc(var Message: TMessage); +begin +// remove PageControl's border + FOriginalPageControlWndProc(Message); + with Message do + if (Msg = TCM_ADJUSTRECT) and (Message.WParam = 0) then + InflateRect(PRect(LParam)^, 4, 4); +end; + +procedure TPeDumpChild.FormCreate(Sender: TObject); +var + I: Integer; +begin + with PageControl1 do + begin + for I := 0 to PageCount - 1 do Pages[I].TabVisible := False; + FOriginalPageControlWndProc := WindowProc; + WindowProc := PageControlWndProc; + ActivePage := ItemsTab; + Realign; + end; + + ImportListView.Tag := $100; + UpdateSortData(ImportListView.Columns[0]); + ExportListView.Tag := $100; + UpdateSortData(ExportListView.Columns[0]); + + UpdateView; +end; + +procedure TPeDumpChild.FormClose(Sender: TObject; var Action: TCloseAction); +var + F: TForm; +begin + Fix_ListViewBeforeClose(Self); + F := MainForm.FindPeResourceView(FPeImage); + if F <> nil then F.Close; + Action := caFree; +end; + +procedure TPeDumpChild.UpdateView; + + procedure BuildImageTree; +var + Category: TPeDumpViewCategory; + TempNode: TTreeNode; + + function AddCategoryNode(ImageIndex: Integer): TTreeNode; +begin + Result := SectionTreeView.Items.AddChildObject(nil, GetCategoryName(Category), + Pointer(Category)); + Result.ImageIndex := ImageIndex; + Result.SelectedIndex := ImageIndex; +end; + +begin + FPeImage.TryGetNamesForOrdinalImports; + with SectionTreeView do + begin + Items.BeginUpdate; + try + Items.Clear; + for Category := Low(Category) to High(Category) do + case Category of + vcHeader: + AddCategoryNode(icoHeader); + vcDirectory: + AddCategoryNode(icoDirectory); + vcSection: + AddCategoryNode(icoSection); + vcLoadConfig: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG] then + AddCategoryNode(icoLoadConfig); + vcImport: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_IMPORT] then + begin + TempNode := AddCategoryNode(icoImports); + TempNode.HasChildren := True; + end; + vcExport: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_EXPORT] then + AddCategoryNode(icoExports); + vcRelocation: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_BASERELOC] then + begin + TempNode := AddCategoryNode(icoRelocation); + TempNode.HasChildren := True; + end; + vcResource: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_RESOURCE] then + begin + TempNode := AddCategoryNode(icoResources); + TempNode.HasChildren := True; + end; + vcDebug: + if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_DEBUG] then + AddCategoryNode(icoDebug); + end; + Selected := Items.GetFirstNode; + finally + Items.EndUpdate; + end; + end; +end; + +begin + BuildImageTree; + + with DirectoryListView do + begin + Items.Count := IMAGE_NUMBEROF_DIRECTORY_ENTRIES; + ItemFocused := Items[0]; + end; + with SectionListView do + begin + Items.Count := FPeImage.ImageSectionCount; + if Items.Count > 0 then ItemFocused := Items[0]; + end; + ExportListView.Items.Count := FPeImage.ExportList.Count; + UpdateResourceDir; + with ExportStatusBar, FPeImage.ExportList do + begin + Panels[0].Text := Format(RsNumberOfNames, [Count]); + Panels[1].Text := Format(RsNumberOfFunctions, [FunctionCount]); + Panels[2].Text := Format(RsOrdinalBase, [Base]); + end; +end; + +procedure TPeDumpChild.ItemsListViewData(Sender: TObject; Item: TListItem); +begin + with Item, FPeImage do + case TListView(Sender).Tag of + 0: begin + Caption := HeaderNames(TJclPeHeader(Index)); + SubItems.Add(HeaderValues[TJclPeHeader(Index)]); + end; + 1: begin + Caption := LoadConfigNames(TJclLoadConfig(Index)); + SubItems.Add(LoadConfigValues[TJclLoadConfig(Index)]); + end; + end; +end; + +procedure TPeDumpChild.SectionTreeViewExpanding(Sender: TObject; + Node: TTreeNode; var AllowExpansion: Boolean); +var + I: Integer; + TempNode: TTreeNode; + ResItem: TJclPeResourceItem; +begin + if Node.GetFirstChild = nil then with SectionTreeView do + begin + Items.BeginUpdate; + case GetNodeCategory(Node) of + vcImport: + if GroupImports then + begin + for I := 0 to FPeImage.ImportList.UniqueLibItemCount - 1 do + with Items.AddChild(Node, FPeImage.ImportList.UniqueLibNames[I]) do + begin + Data := Pointer(-1); + ImageIndex := ImageIndexFromImportKind(FPeImage.ImportList.UniqueLibItems[I].ImportKind); + SelectedIndex := ImageIndex; + end; + end else + begin +// FPeImage.ImportList.SortList(ilName); + for I := 0 to FPeImage.ImportList.Count - 1 do + with Items.AddChild(Node, FPeImage.ImportList[I].Name) do + begin + Data := Pointer(FPeImage.ImportList[I].ImportDirectoryIndex); + ImageIndex := ImageIndexFromImportKind(FPeImage.ImportList[I].ImportKind); + SelectedIndex := ImageIndex; + end; + end; + vcResource: + if Node.Level = 0 then + for I := 0 to FPeImage.ResourceList.Count - 1 do + begin + ResItem := FPeImage.ResourceList[I]; + TempNode := Items.AddChildObject(Node, ResItem.ResourceTypeStr, ResItem); + TempNode.ImageIndex := icoResources; + TempNode.SelectedIndex := TempNode.ImageIndex; + TempNode.HasChildren := True; + end + else + begin + ResItem := TJclPeResourceItem(Node.Data); + for I := 0 to ResItem.List.Count - 1 do + with Items.AddChildObject(Node, ResItem.List[I].Name, ResItem.List[I]) do + begin + ImageIndex := icoResources; + SelectedIndex := ImageIndex; + end; + end; + vcRelocation: + for I := 0 to FPeImage.RelocationList.Count - 1 do + with Items.AddChildObject(Node, + Format('%.8x', [FPeImage.RelocationList[I].VirtualAddress]), Pointer(I)) do + begin + ImageIndex := icoRelocation; + SelectedIndex := ImageIndex; + end; + end; + Items.EndUpdate; + end; +end; + +procedure TPeDumpChild.SectionTreeViewChange(Sender: TObject; Node: TTreeNode); +begin + if FUpdatingView then Exit; + case GetNodeCategory(Node) of + vcHeader: + begin + ItemsListView.Items.Count := Integer(High(TJclPeHeader)) + 1; + ItemsListView.Tag := 0; // Header items + ItemsListView.Invalidate; + PageControl1.ActivePage := ItemsTab; + end; + vcDirectory: PageControl1.ActivePage := DirectoryTab; + vcSection: PageControl1.ActivePage := SectionTab; + vcLoadConfig: + begin + ItemsListView.Items.Count := Integer(High(TJclLoadConfig)) + 1; + ItemsListView.Tag := 1; // Load config items + ItemsListView.Invalidate; + PageControl1.ActivePage := ItemsTab; + end; + vcImport: + begin + if Node.Level = 0 then UpdateImportView(nil) else UpdateImportView(Node); + PageControl1.ActivePage := ImportTab; + end; + vcExport: + PageControl1.ActivePage := ExportTab; + vcRelocation: + begin + UpdateRelocationView(Node); + PageControl1.ActivePage := RelocTab; + end; + vcResource: + if Node.Level = 0 then + begin + UpdateResourceDir; + PageControl1.ActivePage := ResourceDirTab; + end else + begin + UpdateResourceView(TJclPeResourceItem(Node.Data)); + PageControl1.ActivePage := ResourceTab; + end; + vcDebug: + begin + DebugListView.Items.Count := FPeImage.DebugList.Count; + PageControl1.ActivePage := DebugTab; + end; + end; +end; + +procedure TPeDumpChild.DirectoryListViewData(Sender: TObject; Item: TListItem); +const + DirectoryIcons: array[0..15] of Integer = + (icoExports, icoImports, icoResources, -1, -1, icoRelocation, icoDebug, + -1, -1, -1, icoLoadConfig, icoBoundImport, -1, icoDelayImport, -1, -1); +var + Percent: Single; +begin + if FPeImage.Target = taWin64 then + begin + with Item, FPeImage.OptionalHeader64 do + begin + Percent := DataDirectory[Index].Size * 100 / SizeOfImage; + Caption := FPeImage.DirectoryNames(Index); + Data := Pointer(DataDirectory[Index].Size); + if Integer(Data) <> 0 then ImageIndex := DirectoryIcons[Index]; + SubItems.Add(Format('%.8x', [DataDirectory[Index].VirtualAddress])); + SubItems.Add(Format('%.8x', [DataDirectory[Index].Size])); + SubItems.Add(Format('%3.1f%%', [Percent])); + SubItems.Add(FPeImage.ImageSectionNameFromRva[DataDirectory[Index].VirtualAddress]); + end; + end + else + begin + with Item, FPeImage.OptionalHeader32 do + begin + Percent := DataDirectory[Index].Size * 100 / SizeOfImage; + Caption := FPeImage.DirectoryNames(Index); + Data := Pointer(DataDirectory[Index].Size); + if Integer(Data) <> 0 then ImageIndex := DirectoryIcons[Index]; + SubItems.Add(Format('%.8x', [DataDirectory[Index].VirtualAddress])); + SubItems.Add(Format('%.8x', [DataDirectory[Index].Size])); + SubItems.Add(Format('%3.1f%%', [Percent])); + SubItems.Add(FPeImage.ImageSectionNameFromRva[DataDirectory[Index].VirtualAddress]); + end; + end; +end; + +class procedure TPeDumpChild.UpdateSortData(Column: TListColumn); +var + ListView: TListView; + I: Integer; +begin + ListView := TListView(TListColumns(Column.Collection).Owner); + ListView.Columns.BeginUpdate; + with ListView.Columns do + for I := 0 to Count - 1 do + Items[I].ImageIndex := -1; + if ListView.Tag and $FF = Column.Index then + ListView.Tag := ListView.Tag xor $100 + else + ListView.Tag := Column.Index; + if ListView.Tag and $100 = 0 then + Column.ImageIndex := icoSortDesc + else + Column.ImageIndex := icoSortAsc; + ListView.Columns.EndUpdate; +end; + +procedure TPeDumpChild.ImportListViewColumnClick(Sender: TObject; Column: TListColumn); +begin + UpdateSortData(Column); + ImportListViewSort; +end; + +procedure TPeDumpChild.UpdateImportView(Node: TTreeNode); +const + LinkerProducers: array[TJclPeLinkerProducer] of string = + ('Borland', 'Microsoft'); +begin + FCurrentImportIndex := -1; + if Node = nil then + begin + FPeImage.ImportList.FilterModuleName := ''; + ImportListView.Items.Count := FPeImage.ImportList.AllItemCount; + end else + if Integer(Node.Data) = -1 then + begin + FPeImage.ImportList.FilterModuleName := Node.Text; + ImportListView.Items.Count := FPeImage.ImportList.AllItemCount; + end else + begin + FCurrentImportIndex := Integer(Node.Data); + ImportListView.Items.Count := FPeImage.ImportList[FCurrentImportIndex].Count; + end; + ImportListViewSort; + ImportListView.Invalidate; + with ImportStatusBar, FPeImage.ImportList do + begin + Panels[0].Text := Format(RsNumberOfFunctions, [ImportListView.Items.Count]); + Panels[1].Text := Format(RsLinkerProducer, [LinkerProducers[LinkerProducer]]); + end; +end; + +procedure TPeDumpChild.ImportListViewData(Sender: TObject; Item: TListItem); +var + ViewItem: TJclPeImportFuncItem; +begin + if FCurrentImportIndex = -1 then + ViewItem := FPeImage.ImportList.AllItems[Item.Index] + else + ViewItem := FPeImage.ImportList[FCurrentImportIndex][Item.Index]; + with Item, ViewItem do + begin + if IndirectImportName then + Caption := Format('[%s]', [Name]) + else + Caption := FunctionName(Name); + if IsByOrdinal then + begin + SubItems.Add(Format('%d', [Ordinal])); + SubItems.Add(''); + end else + begin + SubItems.Add(''); + SubItems.Add(Format('%d', [Hint])); + end; + SubItems.Add(ImportLib.Name); + ImageIndex := ImageIndexFromImportKind(ImportLib.ImportKind); + end; +end; + +procedure TPeDumpChild.FormDestroy(Sender: TObject); +begin + FPeImage.Free; +end; + +procedure TPeDumpChild.ExportListViewData(Sender: TObject; Item: TListItem); +begin + with Item, FPeImage.ExportList[Item.Index] do + begin + Caption := FunctionName(Name); + SubItems.Add(Format('%d', [Ordinal])); + SubItems.Add(Format('%d', [Hint])); + SubItems.Add(Format('%.8x', [Address])); + SubItems.Add(ForwardedName); + SubItems.Add(SectionName); + ImageIndex := 3; + end; +end; + +procedure TPeDumpChild.ExportListViewColumnClick(Sender: TObject; + Column: TListColumn); +begin + UpdateSortData(Column); + ExportListViewSort; +end; + +function TPeDumpChild.IsListViewActiveAndFocused(ListView: TListView): Boolean; +begin + Result := (ActiveControl = ListView) and (ListView.ItemFocused <> nil); +end; + +procedure TPeDumpChild.SectionTreeViewDblClick(Sender: TObject); +begin + MainForm.OpenLibrary1.Execute; +end; + +procedure TPeDumpChild.SectionListViewData(Sender: TObject; Item: TListItem); +var + Percent: Single; +begin + with FPeImage, Item do + begin + Caption := ImageSectionNames[Item.Index]; + with ImageSectionHeaders[Item.Index] do + begin + if FPeImage.Target = taWin64 then + Percent := SizeOfRawData * 100 / OptionalHeader64.SizeOfImage + else + Percent := SizeOfRawData * 100 / OptionalHeader32.SizeOfImage; + SubItems.Add(Format('%.8x', [Misc.VirtualSize])); + SubItems.Add(Format('%.8x', [VirtualAddress])); + SubItems.Add(Format('%.8x', [SizeOfRawData])); + SubItems.Add(Format('%.8x', [PointerToRawData])); + SubItems.Add(Format('%.8x', [Characteristics])); + SubItems.Add(ShortSectionInfo(Characteristics)); + SubItems.Add(Format('%3.1f%%', [Percent])); + end; + end; +end; + +procedure TPeDumpChild.UpdateResourceView(Directory: TJclPeResourceItem); +begin + ResourceListView.Items.Count := 0; + FCurrentResourceDirectory := Directory; + ResourceListView.Items.Count := Directory.List.Count; + ResourceListView.Invalidate; +end; + +procedure TPeDumpChild.ResourceListViewData(Sender: TObject; Item: TListItem); +var + DirSize, I: Integer; +begin + with Item, FCurrentResourceDirectory.List[Item.Index] do + begin + if IsDirectory then + begin + Caption := Name; + if (List.Count = 1) and (StrToIntDef(List[0].Name, 0) = LANG_NEUTRAL) then + begin // only neutral language + DirSize := List[0].DataEntry^.Size; + SubItems.Add(Format('(%x)', [List[0].DataEntry^.OffsetToData])); + end else + begin + DirSize := 0; + for I := 0 to List.Count - 1 do + Inc(DirSize, List[I].DataEntry^.Size); + SubItems.Add(''); + end; + SubItems.Add(Format('%x', [DirSize])); + SubItems.Add(Format('%d', [List.Count])); + end else + begin + Caption := Format('%s (%s)', [ParentItem.Name, Name]); + SubItems.Add(Format('%x', [DataEntry^.OffsetToData])); + SubItems.Add(Format('%x', [DataEntry^.Size])); + SubItems.Add(LangNameFromName(Name)); + end; + end; +end; + +procedure TPeDumpChild.UpdateResourceDir; +begin + ResourceDirListView.Items.Count := FPeImage.ResourceList.Count; + ResourceDirListView.Invalidate; +end; + +procedure TPeDumpChild.ResourceDirListViewData(Sender: TObject; Item: TListItem); +begin + with Item, FPeImage.ResourceList[Item.Index] do + begin + Caption := ResourceTypeStr; + SubItems.Add(Format('%d', [List.Count])); + end; +end; + +procedure TPeDumpChild.UpdateRelocationView(Node: TTreeNode); +begin + if Node.Level = 0 then + begin + FCurrentRelocationIndex := -1; + RelocListView.Items.Count := FPeImage.RelocationList.AllItemCount; + end else + begin + FCurrentRelocationIndex := Integer(Node.Data); + RelocListView.Items.Count := FPeImage.RelocationList[FCurrentRelocationIndex].Count; + end; + RelocStatusBar.Panels[0].Text := Format(RsAddresses, [RelocListView.Items.Count]); + RelocListView.Invalidate; +end; + +procedure TPeDumpChild.RelocListViewData(Sender: TObject; Item: TListItem); +var + ViewItem: TJclPeRelocation; + + function RelocationTypeStr(RelocType: Byte): string; +begin + case RelocType of + IMAGE_REL_BASED_ABSOLUTE: Result := 'ABSOLUTE'; + IMAGE_REL_BASED_HIGHLOW: Result := 'HIGHLOW'; + else + Result := IntToStr(RelocType); + end; +end; + +begin + if FCurrentRelocationIndex = -1 then + ViewItem := FPeImage.RelocationList.AllItems[Item.Index] + else + ViewItem := FPeImage.RelocationList[FCurrentRelocationIndex][Item.Index]; + with Item, ViewItem do + begin + Caption := Format('%.8x', [VirtualAddress]); + SubItems.Add(RelocationTypeStr(RelocType)); + end; +end; + +procedure TPeDumpChild.DebugListViewData(Sender: TObject; Item: TListItem); +begin + with Item, FPeImage.DebugList[Item.Index] do + begin + Caption := FPeImage.DebugTypeNames(_Type); + SubItems.Add(Format('%.8x', [SizeOfData])); + SubItems.Add(Format('%.8x', [AddressOfRawData])); + SubItems.Add(Format('%.8x', [PointerToRawData])); + SubItems.Add(Format('%d.%.2d', [MajorVersion, MinorVersion])); + end; +end; + +procedure TPeDumpChild.ImportListViewDblClick(Sender: TObject); +begin + MainForm.InvokeHelp1.Execute; +end; + +procedure TPeDumpChild.DirectoryListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +begin + if Integer(Item.Data) = 0 then Sender.Canvas.Font.Color := clGrayText; +end; + +procedure TPeDumpChild.SetGroupImports(const Value: Boolean); +var + NodeIndex: Integer; + TempNode: TTreeNode; + WasExpanded: Boolean; +begin + if FGroupImports <> Value then + begin + FGroupImports := Value; + with SectionTreeView do + begin + Items.BeginUpdate; + FUpdatingView := True; + try + if Assigned(Selected) then + begin + if Selected.Level > 0 then + begin + NodeIndex := Selected.Parent.Index; + WasExpanded := True; + end else + begin + NodeIndex := Selected.Index; + WasExpanded := Selected.Expanded; + end; + end else + begin + NodeIndex := 0; + WasExpanded := False; + end; + Self.UpdateView; + TempNode := Items.GetFirstNode; + while NodeIndex > 0 do + begin + TempNode := TempNode.GetNextSibling; + Dec(NodeIndex); + end; + FUpdatingView := False; + Selected := TempNode; + if WasExpanded then Selected.Expand(False); + finally + Items.EndUpdate; + end; + end; + end; +end; + +procedure TPeDumpChild.ImportListViewSort; +const + MapIndexToSortType: array[0..3] of TJclPeImportSort = (isName, isOrdinal, isHint, isLibImport); +begin + with ImportListView do + begin + if FCurrentImportIndex = -1 then + FPeImage.ImportList.SortAllItemsList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0) + else + FPeImage.ImportList[FCurrentImportIndex].SortList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0); + Invalidate; + end; +end; + +procedure TPeDumpChild.ExportListViewSort; +const + MapIndexToSortType: array[0..5] of TJclPeExportSort = + (esName, esOrdinal, esHint, esAddress, esForwarded, esSection); +begin + with ExportListView do + begin + FPeImage.ExportList.SortList(MapIndexToSortType[Tag and $FF], Tag and $100 <> 0); + Invalidate; + end; +end; + +function TPeDumpChild.GetNodeCategory(Node: TTreeNode): TPeDumpViewCategory; +begin + while Node.Parent <> nil do Node := Node.Parent; + Result := TPeDumpViewCategory(Node.Data); +end; + +procedure TPeDumpChild.SetUnmangleNames(const Value: Boolean); +begin + if FUnmangleNames <> Value then + begin + FUnmangleNames := Value; + ImportListView.Invalidate; + ExportListView.Invalidate; + end; +end; + +function TPeDumpChild.FunctionName(const Name: string): string; +begin + if FUnmangleNames then + PeUnmangleName(Name, Result) + else + Result := Name; +end; + +function TPeDumpChild.HeadersRemark(HeaderItem: TJclPeHeader): string; +const + ImageCharacteristicValues: array [1..14] of packed record + Value: Word; + Name: PChar; + end = ( + (Value: IMAGE_FILE_RELOCS_STRIPPED; Name: 'RELOCS_STRIPPED'), + (Value: IMAGE_FILE_EXECUTABLE_IMAGE; Name: 'EXECUTABLE_IMAGE'), + (Value: IMAGE_FILE_LINE_NUMS_STRIPPED; Name: 'LINE_NUMS_STRIPPED'), + (Value: IMAGE_FILE_LOCAL_SYMS_STRIPPED; Name: 'LOCAL_SYMS_STRIPPED'), + (Value: IMAGE_FILE_AGGRESIVE_WS_TRIM; Name: 'AGGRESIVE_WS_TRIM'), + (Value: IMAGE_FILE_BYTES_REVERSED_LO; Name: 'BYTES_REVERSED_LO'), + (Value: IMAGE_FILE_32BIT_MACHINE; Name: '32BIT_MACHINE'), + (Value: IMAGE_FILE_DEBUG_STRIPPED; Name: 'DEBUG_STRIPPED'), + (Value: IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP; Name: 'REMOVABLE_RUN_FROM_SWAP'), + (Value: IMAGE_FILE_NET_RUN_FROM_SWAP; Name: 'NET_RUN_FROM_SWAP'), + (Value: IMAGE_FILE_SYSTEM; Name: 'SYSTEM'), + (Value: IMAGE_FILE_DLL; Name: 'DLL'), + (Value: IMAGE_FILE_UP_SYSTEM_ONLY; Name: 'UP_SYSTEM_ONLY'), + (Value: IMAGE_FILE_BYTES_REVERSED_HI; Name: 'BYTES_REVERSED_HI') + ); +var + C: Word; + I: Integer; +begin + case HeaderItem of + JclPeHeader_Characteristics: + begin + Result := ''; + C := FPeImage.LoadedImage.FileHeader.FileHeader.Characteristics; + for I := Low(ImageCharacteristicValues) to High(ImageCharacteristicValues) do + if C and ImageCharacteristicValues[I].Value <> 0 then + Result := Result + #13#10 + ImageCharacteristicValues[I].Name; + Delete(Result, 1, 2); + end; + else + Result := ''; + end; +end; + +procedure TPeDumpChild.ItemsListViewInfoTip(Sender: TObject; + Item: TListItem; var InfoTip: String); +begin + case TListView(Sender).Tag of + 0: InfoTip := HeadersRemark(TJclPeHeader(Item.Index)); + end; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.dfm b/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.dfm new file mode 100644 index 0000000..a157874 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.dfm @@ -0,0 +1,144 @@ +object PeGenDefChild: TPeGenDefChild + Left = 278 + Top = 149 + ClientWidth = 401 + ClientHeight = 312 + Caption = 'Pascal unit generator' + Color = clBtnFace + Constraints.MinHeight = 230 + Constraints.MinWidth = 270 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = False + Position = poDefaultPosOnly + Visible = True + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object PageControl1: TPageControl + Left = 0 + Top = 0 + Width = 401 + Height = 311 + ActivePage = TabSheet1 + Align = alClient + Style = tsFlatButtons + TabOrder = 0 + OnChange = PageControl1Change + object TabSheet1: TTabSheet + Caption = '&Options' + object FunctionsListView: TListView + Left = 0 + Top = 96 + Width = 393 + Height = 184 + Anchors = [akLeft, akTop, akRight, akBottom] + Columns = < + item + Caption = 'Original name' + Width = 140 + end + item + Caption = 'Function name' + Width = 140 + end + item + Caption = 'Address' + Width = 70 + end> + ColumnClick = False + HotTrackStyles = [] + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnCustomDrawItem = FunctionsListViewCustomDrawItem + OnData = FunctionsListViewData + end + object GroupBox1: TGroupBox + Left = 0 + Top = 0 + Width = 392 + Height = 81 + Anchors = [akLeft, akTop, akRight] + Caption = 'Code generation options' + TabOrder = 1 + object Label1: TLabel + Left = 8 + Top = 20 + Width = 107 + Height = 13 + Caption = '&Library constant name:' + FocusControl = LibConstNameEdit + end + object LibConstNameEdit: TEdit + Left = 132 + Top = 16 + Width = 116 + Height = 21 + MaxLength = 32 + TabOrder = 0 + end + object WrapSpinEdit: TSpinEdit + Left = 132 + Top = 47 + Width = 57 + Height = 22 + Enabled = False + MaxLength = 3 + MaxValue = 999 + MinValue = 1 + TabOrder = 1 + Value = 80 + end + object WrapCheckBox: TCheckBox + Left = 8 + Top = 48 + Width = 118 + Height = 17 + Caption = '&Wrap text at column:' + TabOrder = 2 + OnClick = WrapCheckBoxClick + end + end + end + object TabSheet2: TTabSheet + Caption = '&Unit source' + ImageIndex = 1 + object UnitRichEdit: TRichEdit + Left = 0 + Top = 0 + Width = 393 + Height = 280 + Align = alClient + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + HideScrollBars = False + ParentFont = False + PlainText = True + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + end + end + object SaveDialog: TSaveDialog + DefaultExt = 'pas' + Filter = 'Pascal unit (*.pas)|*.pas|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 12 + Top = 195 + end +end diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.pas b/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.pas new file mode 100644 index 0000000..140ab4e --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeGenDef.pas @@ -0,0 +1,343 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeGenDef.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit PeGenDef; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + JclPeImage, ComCtrls, StdCtrls, Spin; + +type + TPeUnitGenFlags = set of (ufDecorated, ufDuplicate, ufVariable); + + TPeUnitGenerator = class(TJclPeImage) + private + FUnitGenFlags: array of TPeUnitGenFlags; + function GetUnitGenFlags(Index: Integer): TPeUnitGenFlags; + public + procedure GenerateUnit(Strings: TStrings; const LibConst: string; WrapPos: Integer); + procedure ScanExports; + property UnitGenFlags[Index: Integer]: TPeUnitGenFlags read GetUnitGenFlags; + end; + + TPeGenDefChild = class(TForm) + PageControl1: TPageControl; + TabSheet1: TTabSheet; + TabSheet2: TTabSheet; + FunctionsListView: TListView; + UnitRichEdit: TRichEdit; + GroupBox1: TGroupBox; + Label1: TLabel; + LibConstNameEdit: TEdit; + WrapSpinEdit: TSpinEdit; + WrapCheckBox: TCheckBox; + SaveDialog: TSaveDialog; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FunctionsListViewData(Sender: TObject; Item: TListItem); + procedure FunctionsListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure PageControl1Change(Sender: TObject); + procedure WrapCheckBoxClick(Sender: TObject); + private + FPeUnitGenerator: TPeUnitGenerator; + procedure SetFileName(const Value: TFileName); + function GetFileName: TFileName; + procedure GenerateUnit; + public + function CanSave: Boolean; + procedure SaveUnit; + property FileName: TFileName read GetFileName write SetFileName; + end; + +var + PeGenDefChild: TPeGenDefChild; + +implementation + +uses PeViewerMain, JclFileUtils, ToolsUtils, JclSysUtils; + +{$R *.DFM} + +const + nfDecoratedName = $01; + nfAnsiUnicodePair = $02; + +function PascalizeName(const Name: string): string; +const + ValidLeadingChars = ['A'..'Z', 'a'..'z']; + StripLeadingChars = ['_']; + ValidChars = ValidLeadingChars + ['0'..'9']; + InvalidCharReplacement = '_'; + StopChar = '@'; +var + I: Integer; + C: Char; +begin + SetLength(Result, Length(Name)); + Result := ''; + for I := 1 to Length(Name) do + begin + C := Name[I]; + if I = 1 then + begin + if C in ValidLeadingChars then + Result := Result + C + else + if not (C in StripLeadingChars) then + Break; // probably MS C++ or Borland name decoration + end else + begin + if C in ValidChars then + Result := Result + C + else + if C = StopChar then + Break + else + Result := Result + InvalidCharReplacement; + end; + end; + I := Length(Result); + while I > 0 do + if Result[I] = InvalidCharReplacement then + begin + Delete(Result, I, 1); + Dec(I); + end + else + Break; +end; + +function PossiblyAnsiUnicodePair(const Name1, Name2: AnsiString): Boolean; +const + AnsiUnicodeSuffixes = ['A', 'W']; +var + L1, L2: Integer; + Suffix1, Suffix2: Char; +begin + Result := False; + L1 := Length(Name1); + L2 := Length(Name2); + if (L1 = L2) and (L1 > 1) then + begin + Suffix1 := Name1[L1]; + Suffix2 := Name2[L2]; + Result := (Suffix1 in AnsiUnicodeSuffixes) and (Suffix2 in AnsiUnicodeSuffixes) and + (Suffix1 <> Suffix2) and (Copy(Name1, 1, L1 - 1) = Copy(Name2, 1, L2 - 1)); + end; +end; + +function IsDecoratedName(const Name: string): Boolean; +begin + Result := (Length(Name) > 1) and (Name[1] in ['?', '@']); +end; + + +{ TPeUnitGenerator } + +procedure TPeUnitGenerator.GenerateUnit(Strings: TStrings; const LibConst: string; + WrapPos: Integer); +var + I: Integer; + S: string; +begin + Strings.Add('implementation'); + Strings.Add(''); + Strings.Add('const'); + Strings.Add(Format(' %s = ''%s'';', [LibConst, ExtractFileName(FileName)])); + Strings.Add(''); + for I := 0 to ExportList.Count - 1 do + with ExportList[I] do + if FUnitGenFlags[I] = [] then + begin + S := Format('function %s; external %s name ''%s'';', [PascalizeName(Name), LibConst, Name]); + if WrapPos > 0 then + S := WrapText(S, #13#10' ', [' '], WrapPos); + Strings.Add(S); + end; + Strings.Add(''); + Strings.Add('end.'); +end; + +function TPeUnitGenerator.GetUnitGenFlags(Index: Integer): TPeUnitGenFlags; +begin + Result := FUnitGenFlags[Index]; +end; + +procedure TPeUnitGenerator.ScanExports; +var + I: Integer; + PascalName, LastName, FirstSectionName: string; + LastAddress: DWORD; + Flags: TPeUnitGenFlags; +begin + SetLength(FUnitGenFlags, ExportList.Count); + ExportList.SortList(esName); + LastName := ''; + LastAddress := 0; + FirstSectionName := ImageSectionNames[0]; // The first section is code section + for I := 0 to ExportList.Count - 1 do + with ExportList[I] do + begin + Flags := []; + if SectionName <> FirstSectionName then + Include(Flags, ufVariable) + else + if IsDecoratedName(Name) then + Include(Flags, ufDecorated) + else + begin + PascalName := PascalizeName(Name); + if (LastAddress = Address) and (LastName = PascalName) then + Include(Flags, ufDuplicate); + LastName := PascalName; + LastAddress := Address; + end; + FUnitGenFlags[I] := Flags; + end; +end; + +{ TPeGenDefChild } + +procedure TPeGenDefChild.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Fix_ListViewBeforeClose(Self); + Action := caFree; +end; + +procedure TPeGenDefChild.FormCreate(Sender: TObject); +begin + FPeUnitGenerator := TPeUnitGenerator.Create; +end; + +procedure TPeGenDefChild.FormDestroy(Sender: TObject); +begin + FreeAndNil(FPeUnitGenerator); +end; + +function TPeGenDefChild.GetFileName: TFileName; +begin + Result := FPeUnitGenerator.FileName; +end; + +procedure TPeGenDefChild.SetFileName(const Value: TFileName); +begin + Screen.Cursor := crHourGlass; + try + FPeUnitGenerator.FileName := Value; + FPeUnitGenerator.ScanExports; + LibConstNameEdit.Text := PathExtractFileNameNoExt(Value) + 'Lib'; + FunctionsListView.Items.Count := FPeUnitGenerator.ExportList.Count; + FunctionsListView.Invalidate; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TPeGenDefChild.FunctionsListViewData(Sender: TObject; Item: TListItem); +var + Flags: TPeUnitGenFlags; +begin + Flags := FPeUnitGenerator.UnitGenFlags[Item.Index]; + with Item, FPeUnitGenerator.ExportList[Item.Index] do + begin + Caption := Name; + SubItems.Add(PascalizeName(Name)); + SubItems.Add(AddressOrForwardStr); + if ufDuplicate in Flags then + ImageIndex := icoWarning + else + if Flags * [ufDecorated, ufVariable] = [] then + ImageIndex := icoExports + else + ImageIndex := -1; + end; +end; + +procedure TPeGenDefChild.FunctionsListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +var + Flags: TPeUnitGenFlags; +begin + Flags := FPeUnitGenerator.UnitGenFlags[Item.Index]; + if Flags * [ufDecorated, ufVariable] <> [] then + Sender.Canvas.Font.Style := [fsStrikeOut]; +end; + +procedure TPeGenDefChild.GenerateUnit; +var + SL: TStringList; + WrapColumn: Integer; +begin + Screen.Cursor := crHourGlass; + SL := TStringList.Create; + try + if WrapCheckBox.Checked then + WrapColumn := WrapSpinEdit.Value + else + WrapColumn := 0; + FPeUnitGenerator.GenerateUnit(SL, LibConstNameEdit.Text, WrapColumn); + UnitRichEdit.Text := SL.Text; + finally + SL.Free; + Screen.Cursor := crDefault; + end; +end; + +procedure TPeGenDefChild.PageControl1Change(Sender: TObject); +begin + if PageControl1.ActivePage = TabSheet1 then + LibConstNameEdit.SetFocus + else + if PageControl1.ActivePage = TabSheet2 then + GenerateUnit; +end; + +procedure TPeGenDefChild.WrapCheckBoxClick(Sender: TObject); +begin + WrapSpinEdit.Enabled := WrapCheckBox.Checked; +end; + +function TPeGenDefChild.CanSave: Boolean; +begin + Result := PageControl1.ActivePage = TabSheet2; +end; + +procedure TPeGenDefChild.SaveUnit; +begin + with SaveDialog do + begin + FileName := PathExtractFileNameNoExt(FPeUnitGenerator.FileName); + if Execute then + UnitRichEdit.Lines.SaveToFile(FileName); + end; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeResView.dfm b/official/1.100/examples/windows/delphitools/peviewer/PeResView.dfm new file mode 100644 index 0000000..edb8b7c --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeResView.dfm @@ -0,0 +1,420 @@ +object PeResViewChild: TPeResViewChild + Left = 380 + Top = 203 + AutoScroll = False + Caption = 'PeResViewChild' + ClientHeight = 407 + ClientWidth = 597 + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 250 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = False + PopupMenu = PopupMenu1 + Position = poDefault + Visible = True + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 121 + Top = 0 + Width = 3 + Height = 407 + Cursor = crHSplit + ResizeStyle = rsUpdate + end + object ResourceTreeView: TTreeView + Left = 0 + Top = 0 + Width = 121 + Height = 407 + Align = alLeft + HideSelection = False + Images = MainForm.IconImageList + Indent = 19 + ReadOnly = True + TabOrder = 0 + OnChange = ResourceTreeViewChange + OnExpanding = ResourceTreeViewExpanding + end + object PageControl1: TPageControl + Left = 124 + Top = 0 + Width = 473 + Height = 407 + ActivePage = DirTab + Align = alClient + TabOrder = 1 + TabStop = False + object DirTab: TTabSheet + Caption = 'DirTab' + object DirListView: TListView + Left = 0 + Top = 0 + Width = 465 + Height = 379 + Align = alClient + Columns = < + item + Caption = 'Name' + Width = 150 + end + item + Caption = 'Offset' + Width = 70 + end + item + Caption = 'Size' + Width = 70 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = DirListViewData + end + end + object HexDumpTab: TTabSheet + Caption = 'HexDumpTab' + ImageIndex = 1 + object HexDumpListView: TListView + Left = 0 + Top = 0 + Width = 465 + Height = 379 + Align = alClient + Columns = < + item + Caption = 'Offset' + Width = 70 + end + item + Caption = 'Data' + Width = 250 + end + item + Caption = 'ASCII' + Width = 70 + end> + ColumnClick = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + ParentFont = False + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = HexDumpListViewData + end + end + object StringsTab: TTabSheet + Caption = 'StringsTab' + ImageIndex = 2 + object Splitter2: TSplitter + Left = 0 + Top = 341 + Width = 465 + Height = 3 + Cursor = crVSplit + Align = alBottom + ResizeStyle = rsUpdate + end + object StringsListView: TListView + Left = 0 + Top = 0 + Width = 465 + Height = 341 + Align = alClient + Columns = < + item + Caption = 'ID' + Width = 70 + end + item + Caption = 'Text' + Width = 300 + end> + ColumnClick = False + GridLines = True + HideSelection = False + HotTrackStyles = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + SmallImages = MainForm.IconImageList + TabOrder = 0 + ViewStyle = vsReport + OnData = StringsListViewData + OnSelectItem = StringsListViewSelectItem + end + object DetailedStringMemo: TMemo + Left = 0 + Top = 344 + Width = 465 + Height = 35 + Align = alBottom + Color = clBtnFace + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 1 + end + end + object GraphDirTab: TTabSheet + Caption = 'GraphDirTab' + ImageIndex = 3 + object GraphDrawGrid: TDrawGrid + Left = 0 + Top = 0 + Width = 465 + Height = 379 + Align = alClient + ColCount = 2 + DefaultDrawing = False + FixedCols = 0 + Options = [goVertLine, goHorzLine, goColSizing, goRowSelect, goThumbTracking] + TabOrder = 0 + OnDrawCell = GraphDrawGridDrawCell + ColWidths = ( + 147 + 277) + end + end + object TextTab: TTabSheet + Caption = 'TextTab' + ImageIndex = 4 + object TextRichEdit: TRichEdit + Left = 0 + Top = 0 + Width = 465 + Height = 379 + Align = alClient + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + HideScrollBars = False + ParentFont = False + PlainText = True + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 0 + WordWrap = False + end + end + object AviTab: TTabSheet + Caption = 'AviTab' + ImageIndex = 5 + PopupMenu = AviPopupMenu + object Bevel2: TBevel + Left = 0 + Top = 26 + Width = 465 + Height = 334 + Align = alClient + end + object Animate1: TAnimate + Left = 8 + Top = 40 + Width = 100 + Height = 80 + Active = False + Color = clBtnFace + ParentColor = False + OnOpen = Animate1Open + OnClose = Animate1Close + OnStop = Animate1Stop + end + object AviToolBar: TToolBar + Left = 0 + Top = 0 + Width = 465 + Height = 26 + AutoSize = True + ButtonWidth = 51 + Caption = 'AviToolBar' + EdgeBorders = [ebLeft, ebTop, ebRight, ebBottom] + Flat = True + Images = MainForm.ToolbarImagesList + List = True + ShowCaptions = True + TabOrder = 1 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = AviPlay1 + end + object ToolButton2: TToolButton + Left = 51 + Top = 0 + Action = AviStop1 + end + object ToolButton3: TToolButton + Left = 102 + Top = 0 + Action = AviBkColor1 + end + end + object AviStatusBar: TStatusBar + Left = 0 + Top = 360 + Width = 465 + Height = 19 + Panels = < + item + Width = 150 + end> + SimplePanel = False + end + end + object HTMLTab: TTabSheet + Caption = 'HTMLTab' + ImageIndex = 6 + end + object GraphTab: TTabSheet + Caption = 'GraphTab' + ImageIndex = 7 + object GraphImage: TImage + Left = 0 + Top = 0 + Width = 465 + Height = 360 + Align = alClient + AutoSize = True + Center = True + end + object Bevel1: TBevel + Left = 0 + Top = 0 + Width = 465 + Height = 360 + Align = alClient + end + object GraphStatusBar: TStatusBar + Left = 0 + Top = 360 + Width = 465 + Height = 19 + Panels = < + item + Width = 50 + end> + SimplePanel = False + end + end + object DialogTab: TTabSheet + Caption = 'DialogTab' + ImageIndex = 8 + object Bevel3: TBevel + Left = 0 + Top = 0 + Width = 465 + Height = 379 + Align = alClient + end + object DialogTestBtn: TButton + Left = 8 + Top = 8 + Width = 75 + Height = 25 + Caption = '&Show dialog' + TabOrder = 0 + OnClick = DialogTestBtnClick + end + end + end + object ActionList1: TActionList + Images = MainForm.ToolbarImagesList + Left = 136 + Top = 352 + object AviPlay1: TAction + Caption = 'Play' + ImageIndex = 16 + OnExecute = AviPlay1Execute + end + object AviStop1: TAction + Caption = 'Stop' + Enabled = False + ImageIndex = 17 + OnExecute = AviStop1Execute + end + object AviBkColor1: TAction + Caption = 'Color' + ImageIndex = 18 + OnExecute = AviBkColor1Execute + end + end + object ColorDialog1: TColorDialog + Ctl3D = True + Options = [cdPreventFullOpen, cdSolidColor] + Left = 168 + Top = 352 + end + object AviPopupMenu: TPopupMenu + Images = MainForm.ToolbarImagesList + Left = 200 + Top = 352 + object Play1: TMenuItem + Action = AviPlay1 + end + object Stop1: TMenuItem + Action = AviStop1 + end + object Color1: TMenuItem + Action = AviBkColor1 + end + end + object SaveDialog1: TSaveDialog + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 232 + Top = 352 + end + object PopupMenu1: TPopupMenu + Images = MainForm.ToolbarImagesList + Left = 264 + Top = 352 + object Copytoclipboard1: TMenuItem + Action = MainForm.Copy1 + end + object Savetofile1: TMenuItem + Action = MainForm.Save1 + end + object Selectall1: TMenuItem + Action = MainForm.SelectAll1 + end + object N1: TMenuItem + Caption = '-' + end + object Viewdetails1: TMenuItem + Action = MainForm.ViewResDetails1 + end + object Viewashex1: TMenuItem + Action = MainForm.ViewResHex1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeResView.pas b/official/1.100/examples/windows/delphitools/peviewer/PeResView.pas new file mode 100644 index 0000000..3f0bacc --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeResView.pas @@ -0,0 +1,710 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeResView.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit PeResView; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + JclPeImage, PeResource, JclLogic, JclGraphUtils, ComCtrls, StdCtrls, + ExtCtrls, Grids, ToolWin, ActnList, OleCtrls, Menus, SHDocVw_TLB; + +type + TPeResViewChild = class(TForm) + ResourceTreeView: TTreeView; + PageControl1: TPageControl; + Splitter1: TSplitter; + DirTab: TTabSheet; + HexDumpTab: TTabSheet; + DirListView: TListView; + HexDumpListView: TListView; + StringsTab: TTabSheet; + StringsListView: TListView; + GraphDirTab: TTabSheet; + GraphDrawGrid: TDrawGrid; + TextTab: TTabSheet; + TextRichEdit: TRichEdit; + AviTab: TTabSheet; + Animate1: TAnimate; + AviToolBar: TToolBar; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + ActionList1: TActionList; + AviPlay1: TAction; + AviStop1: TAction; + HTMLTab: TTabSheet; + GraphTab: TTabSheet; + GraphImage: TImage; + Bevel1: TBevel; + GraphStatusBar: TStatusBar; + DetailedStringMemo: TMemo; + Splitter2: TSplitter; + Bevel2: TBevel; + AviStatusBar: TStatusBar; + AviBkColor1: TAction; + ColorDialog1: TColorDialog; + ToolButton3: TToolButton; + AviPopupMenu: TPopupMenu; + Play1: TMenuItem; + Stop1: TMenuItem; + Color1: TMenuItem; + DialogTab: TTabSheet; + SaveDialog1: TSaveDialog; + DialogTestBtn: TButton; + Bevel3: TBevel; + PopupMenu1: TPopupMenu; + Copytoclipboard1: TMenuItem; + Savetofile1: TMenuItem; + N1: TMenuItem; + Viewdetails1: TMenuItem; + Viewashex1: TMenuItem; + Selectall1: TMenuItem; + procedure FormDestroy(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure ResourceTreeViewChange(Sender: TObject; Node: TTreeNode); + procedure DirListViewData(Sender: TObject; Item: TListItem); + procedure HexDumpListViewData(Sender: TObject; Item: TListItem); + procedure StringsListViewData(Sender: TObject; Item: TListItem); + procedure GraphDrawGridDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); + procedure AviPlay1Execute(Sender: TObject); + procedure AviStop1Execute(Sender: TObject); + procedure Animate1Stop(Sender: TObject); + procedure StringsListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure Animate1Open(Sender: TObject); + procedure Animate1Close(Sender: TObject); + procedure AviBkColor1Execute(Sender: TObject); + procedure ResourceTreeViewExpanding(Sender: TObject; Node: TTreeNode; + var AllowExpansion: Boolean); + procedure DialogTestBtnClick(Sender: TObject); + private + FCurrentDir: TPeResItem; + FOriginalPageControlWndProc: TWndMethod; + FResourceImage: TPeResImage; + FSelectedItem: TPeResItem; + FSelectedNode: TTreeNode; + FShowAsHexView: Boolean; + FStringsList: TStringList; + FShowSpecialDirView: Boolean; + FTempGraphic: TPicture; + WebBrowser1: TWebBrowser; + procedure CreateStringsList(Item: TPeResUnkStrings); + procedure CreateGraphicList(Item: TPeResItem); + function GetPeImage: TJclPeImage; + procedure PageControlWndProc(var Message: TMessage); + procedure UpdateSelected; + procedure UpdateView; + procedure SetShowAsHexView(const Value: Boolean); + procedure SetShowSpecialDirView(const Value: Boolean); + public + constructor CreateEx(AOwner: TComponent; APeImage: TJclPeImage); + function CanSaveResource: Boolean; + procedure SaveResource; + property PeImage: TJclPeImage read GetPeImage; + property ShowAsHexView: Boolean read FShowAsHexView write SetShowAsHexView; + property ShowSpecialDirView: Boolean read FShowSpecialDirView write SetShowSpecialDirView; + end; + +var + PeResViewChild: TPeResViewChild; + +implementation + +{$R *.DFM} + +uses + CommCtrl, PeViewerMain, ToolsUtils, JclStrings, JclSysUtils; + +resourcestring + RsAviStatus = 'Width: %u, Height: %u, Frames: %u'; + RsGraphicStatus = 'Width: %u, Height: %u, Bits per pixel: %u'; + RsTitle = 'Resources - %s'; + +const + MinGraphRowHeight = 18; + MaxGraphRowHeight = 150; + +{ TPeResViewChild } + +constructor TPeResViewChild.CreateEx(AOwner: TComponent; APeImage: TJclPeImage); +begin + inherited Create(AOwner); + FShowSpecialDirView := True; + FStringsList := TStringList.Create; + FTempGraphic := TPicture.Create; + FResourceImage := TPeResImage.Create; + FResourceImage.PeImage := APeImage; + Caption := Format(RsTitle, [ExtractFileName(FResourceImage.FileName)]); + WebBrowser1 := TWebBrowser.Create(Self); + TWinControl(WebBrowser1).Parent := HTMLTab; + WebBrowser1.Align := alClient; +end; + +procedure TPeResViewChild.PageControlWndProc(var Message: TMessage); +begin +// remove PageControl's border + FOriginalPageControlWndProc(Message); + with Message do + if (Msg = TCM_ADJUSTRECT) and (Message.WParam = 0) then + InflateRect(PRect(LParam)^, 4, 4); +end; + +procedure TPeResViewChild.FormCreate(Sender: TObject); +var + I: Integer; +begin + with PageControl1 do + begin + for I := 0 to PageCount - 1 do Pages[I].TabVisible := False; + FOriginalPageControlWndProc := WindowProc; + WindowProc := PageControlWndProc; + ActivePage := DirTab; + Realign; + end; + UpdateView; +end; + +procedure TPeResViewChild.FormDestroy(Sender: TObject); +begin + FreeAndNil(FTempGraphic); + FreeAndNil(FStringsList); + FreeAndNil(FResourceImage); +end; + +procedure TPeResViewChild.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Fix_ListViewBeforeClose(Self); + Action := caFree; +end; + +procedure TPeResViewChild.UpdateView; +var + I: Integer; +begin + with ResourceTreeView do + begin + Items.BeginUpdate; + try + Items.Clear; + for I := 0 to FResourceImage.Count - 1 do + with Items.AddObject(nil, FResourceImage[I].ResName, FResourceImage[I]) do + begin + ImageIndex := icoFolderShut; + SelectedIndex := icoFolderOpen; + HasChildren := True; + end; + finally + Items.EndUpdate; + end; + end; +end; + +function TPeResViewChild.GetPeImage: TJclPeImage; +begin + Result := FResourceImage.PeImage; +end; + +procedure TPeResViewChild.ResourceTreeViewChange(Sender: TObject; + Node: TTreeNode); +begin + DirListView.Items.Count := 0; + HexDumpListView.Items.Count := 0; + StringsListView.Items.Count := 0; + GraphDrawGrid.RowCount := 2; + FSelectedNode := Node; + UpdateSelected; +end; + +procedure TPeResViewChild.DirListViewData(Sender: TObject; + Item: TListItem); +begin + with Item, FCurrentDir[Item.Index] do + begin + Caption := ResName; + SubItems.Add(Format('%x', [Offset])); + SubItems.Add(Format('%x', [Size])); + end; +end; + +procedure TPeResViewChild.HexDumpListViewData(Sender: TObject; + Item: TListItem); +var + DumpData: PByte; + Address, EndAddress: Integer; + Hex, Ascii: string; + I: Integer; +begin + with Item do + begin + DumpData := PByte(DWORD(FSelectedItem.RawData) + DWORD(Index * 16)); + Address := FSelectedItem.Offset + Index * 16; + EndAddress := FSelectedItem.Offset + FSelectedItem.Size - 1; + SetLength(Hex, 3 * 16); + SetLength(Ascii, 3 * 16); + Hex := ''; + Ascii := ''; + for I := 0 to 15 do + begin + Hex := Hex + Format('%.2x ', [DumpData^]); + if DumpData^ >= 32 then + Ascii := Ascii + Chr(DumpData^) + else + Ascii := Ascii + '.'; + Inc(DumpData); + if Address + I >= EndAddress then Break; + end; + Item.Caption := Format('%x', [Address]); + Item.SubItems.Add(Hex); + Item.SubItems.Add(Ascii); + end; +end; + +procedure TPeResViewChild.SetShowAsHexView(const Value: Boolean); +begin + if FShowAsHexView <> Value then + begin + FShowAsHexView := Value; + UpdateSelected; + end; +end; + +procedure TPeResViewChild.SetShowSpecialDirView(const Value: Boolean); +begin + if FShowSpecialDirView <> Value then + begin + FShowSpecialDirView := Value; + UpdateSelected; + end; +end; + +procedure TPeResViewChild.CreateStringsList(Item: TPeResUnkStrings); +var + I: Integer; +begin + FStringsList.Clear; + DetailedStringMemo.Lines.Clear; + if not Item.IsList then + TPeResUnkStrings(Item).FillStrings(FStringsList) + else + for I := 0 to Item.ItemCount - 1 do + TPeResUnkStrings(Item[I]).FillStrings(FStringsList); + StringsListView.Items.Count := FStringsList.Count; + StringsListView.Invalidate; +end; + +procedure TPeResViewChild.StringsListViewData(Sender: TObject; Item: TListItem); +begin + with Item do + begin + Caption := Format('%u', [DWORD(FStringsList.Objects[Index])]); + SubItems.Add(StrRemoveChars(FStringsList[Index], [AnsiCarriageReturn, AnsiLineFeed])); + end; +end; + +procedure TPeResViewChild.CreateGraphicList(Item: TPeResItem); +var + I, J, MaxRowHeight, TotalMaxRowHeight: Integer; + + procedure CalculateHeight(Item: TPeResItem); + var + H: Integer; + begin + case Item.Kind of + rkCursor: + H := GetSystemMetrics(SM_CYCURSOR); + rkIcon: + H := GetSystemMetrics(SM_CYICON); + rkBitmap: + H := TPeResUnkGraphic(Item).GraphicProperties.Height; + else + FTempGraphic.Assign(Item); + H := FTempGraphic.Height; + end; + MaxRowHeight := Max(MaxRowHeight, H); + end; + +begin + TotalMaxRowHeight := 0; + with GraphDrawGrid do + begin + SendMessage(Handle, WM_SETREDRAW, 0, 0); + try + RowCount := Item.ItemCount + 1; + RowHeights[0] := MinGraphRowHeight; + for I := 0 to Item.ItemCount - 1 do + begin + MaxRowHeight := 0; + if Item[I].IsList then + for J := 0 to Item[I].ItemCount - 1 do + CalculateHeight(Item[I][J]) + else + CalculateHeight(Item[I]); + RowHeights[I + 1] := Min(Max(MinGraphRowHeight, MaxRowHeight + 4), MaxGraphRowHeight); + TotalMaxRowHeight := Max(TotalMaxRowHeight, MaxRowHeight); + end; + finally + SendMessage(Handle, WM_SETREDRAW, 1, 0); + Invalidate; + end; + end; +end; + +procedure TPeResViewChild.GraphDrawGridDrawCell(Sender: TObject; ACol, + ARow: Integer; Rect: TRect; State: TGridDrawState); +var + Text: string; + Item: TPeResItem; + I, W: Integer; + DrawRect: TRect; +begin + with GraphDrawGrid do + begin + if ARow = 0 then + with Canvas do + begin + case ACol of + 0: Text := 'Name'; + 1: Text := 'Graphic'; + end; + Brush.Color := clBtnFace; + Font.Color := clBtnText; + Dec(Rect.Bottom, 2); + Dec(Rect.Right); + FillRect(Rect); + TextRect(Rect, Rect.Left + 6, Rect.Top + 2, Text); + DrawEdge(Handle, Rect, EDGE_ETCHED, BF_BOTTOMRIGHT or BF_FLAT); + Pen.Color := Color; + Polyline([Point(Rect.Right, Rect.Top), Point(Rect.Right, Rect.Bottom), + Point(Rect.Left, Rect.Bottom)]); + Inc(Rect.Bottom); + MoveTo(Rect.Left, Rect.Bottom); + LineTo(Rect.Right, Rect.Bottom); + Pen.Color := clBtnFace; + Inc(Rect.Bottom); + MoveTo(Rect.Left, Rect.Bottom); + LineTo(Rect.Right, Rect.Bottom); + end else + begin + if (gdSelected in State) and Focused then + begin + Canvas.Brush.Color := clHighlight; + Canvas.Font.Color := clHighlightText; + Canvas.FillRect(Rect); + DrawFocusRect(Canvas.Handle, Rect); + end else + begin + Canvas.Brush.Color := Color; + Canvas.Font.Color := Font.Color; + Canvas.FillRect(Rect); + end; + InflateRect(Rect, -1, -1); + Item := FCurrentDir[ARow - 1]; + case ACol of + 0:Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Item.ResName); + 1:begin + W := 0; + if not Item.IsList then + begin + FTempGraphic.Assign(Item); + with FTempGraphic do + SetRect(DrawRect, Rect.Left, Rect.Top, Rect.Left + Width, Rect.Top + Height); + if not RectIncludesRect(DrawRect, Rect) then + begin + DrawRect.Right := Min(DrawRect.Right, Rect.Right); + DrawRect.Bottom := Min(DrawRect.Bottom, Rect.Bottom); + Canvas.StretchDraw(DrawRect, FTempGraphic.Graphic); + end + else + Canvas.Draw(Rect.Left + 2, Rect.Top + 2, FTempGraphic.Graphic); + end else + for I := 0 to Item.ItemCount - 1 do + begin + FTempGraphic.Assign(Item[I]); + Canvas.Draw(Rect.Left + 2 + W, Rect.Top + 2, FTempGraphic.Graphic); + Inc(W, FTempGraphic.Width + 5); + end; + end; + end; + end; + end; +end; + +procedure TPeResViewChild.AviPlay1Execute(Sender: TObject); +begin + with Animate1 do + Play(1, FrameCount, 1); + AviStop1.Enabled := True; + AviPlay1.Enabled := False; +end; + +procedure TPeResViewChild.AviStop1Execute(Sender: TObject); +begin + Animate1.Stop; + AviStop1.Enabled := False; +end; + +procedure TPeResViewChild.Animate1Stop(Sender: TObject); +begin + AviPlay1.Enabled := True; + AviStop1.Enabled := False; +end; + +procedure TPeResViewChild.StringsListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected then DetailedStringMemo.Text := Item.SubItems[0]; +end; + +procedure TPeResViewChild.Animate1Open(Sender: TObject); +begin + with Animate1 do + AviStatusBar.Panels[0].Text := Format(RsAviStatus, [FrameWidth, FrameHeight, + FrameCount]); +end; + +procedure TPeResViewChild.Animate1Close(Sender: TObject); +begin + AviStatusBar.Panels[0].Text := ''; +end; + +procedure TPeResViewChild.AviBkColor1Execute(Sender: TObject); +begin + with ColorDialog1 do + begin + CustomColors.Values['ColorA'] := Format('%.6x', [ColorToRGB(clBtnFace)]); + Color := Animate1.Color; + if Execute then Animate1.Color := Color; + end; +end; + +procedure TPeResViewChild.UpdateSelected; + + function SpecialDirectoryView: Boolean; + begin + Result := True; + case FCurrentDir.Kind of + rkBitmap, rkCursor, rkIcon: + begin + CreateGraphicList(FCurrentDir); + PageControl1.ActivePage := GraphDirTab; + end; + rkString: + begin + CreateStringsList(TPeResString(FCurrentDir)); + PageControl1.ActivePage := StringsTab; + end; + else + Result := False; + end; + end; + + procedure DefaultDirectoryView; + begin + DirListView.Items.Count := FCurrentDir.ItemCount; + DirListView.Invalidate; + PageControl1.ActivePage := DirTab; + end; + + function SpecialDetailView: Boolean; + begin + Result := True; + case FSelectedItem.Kind of + rkAccelerator: + begin + TextRichEdit.Lines.Assign(TPeResAccelerator(FSelectedItem)); + PageControl1.ActivePage := TextTab; + end; + rkAvi: + begin + Animate1.Assign(FSelectedItem); + PageControl1.ActivePage := AviTab; + end; + rkBitmap, rkIcon, rkCursor: + begin + GraphImage.Picture.Assign(FSelectedItem); + if GraphImage.Picture.Graphic is TBitmap then + GraphImage.Picture.Bitmap.Transparent := True; + with TPeResUnkGraphic(FSelectedItem).GraphicProperties do + GraphStatusBar.Panels[0].Text := Format(RsGraphicStatus, [Width, Height, BitsPerPixel]); + PageControl1.ActivePage := GraphTab; + end; + rkString: + begin + CreateStringsList(TPeResString(FSelectedItem)); + PageControl1.ActivePage := StringsTab; + end; + rkHTML: + begin + WebBrowser1.Navigate(TPeResHTML(FSelectedItem).ResPath); + PageControl1.ActivePage := HTMLTab; + end; + rkData: + if TPeResRCData(FSelectedItem).DataKind <> dkUnknown then + begin + TextRichEdit.Lines.Assign(TPeResRCData(FSelectedItem)); + PageControl1.ActivePage := TextTab; + end else + Result := False; +{ rkDialog: + begin + DialogTestBtn.Enabled := TPeResDialog(FSelectedItem).CanShowDialog; + PageControl1.ActivePage := DialogTab; + end;} { TODO : Check for dialog templates } + rkMessageTable: + begin + CreateStringsList(TPeResUnkStrings(FSelectedItem)); + PageControl1.ActivePage := StringsTab; + end; + rkVersion: + begin + TextRichEdit.Lines.Assign(TPeResVersion(FSelectedItem)); + PageControl1.ActivePage := TextTab; + end; + else + Result := False; + end; + end; + + procedure DefaultDetailView; + begin + HexDumpListView.Items.Count := (FSelectedItem.Size - 1) div 16 + 1; + HexDumpListView.Invalidate; + PageControl1.ActivePage := HexDumpTab; + end; + +begin + FSelectedItem := TPeResItem(FSelectedNode.Data); + FCurrentDir := FSelectedItem; + if FSelectedNode.Level = 0 then + begin +// FCurrentDir := FSelectedItem; + if (not FShowSpecialDirView) or (not SpecialDirectoryView) then + DefaultDirectoryView; + end else + begin + if FSelectedItem.IsList then + begin +// FCurrentDir := FSelectedItem; + DefaultDirectoryView; + end else + begin + if FShowAsHexView or (not SpecialDetailView) then + DefaultDetailView; + end; + end; +end; + +function TPeResViewChild.CanSaveResource: Boolean; +begin + Result := Assigned(FSelectedItem) and not FSelectedItem.IsList and + ResourceTreeView.Focused; +end; + +procedure TPeResViewChild.ResourceTreeViewExpanding(Sender: TObject; + Node: TTreeNode; var AllowExpansion: Boolean); +var + N, L: Integer; + ListNode, ItemNode: TTreeNode; + Item, RootItem: TPeResItem; +begin + if Node.GetFirstChild = nil then with ResourceTreeView do + begin + Items.BeginUpdate; + try + RootItem := TPeResItem(Node.Data); + for N := 0 to RootItem.ItemCount - 1 do + begin + Item := RootItem[N]; + ListNode := Items.AddChildObject(Node, Item.ResName, Item); + if Item.IsList then + begin + ListNode.ImageIndex := icoFolderShut; + ListNode.SelectedIndex := icoFolderOpen; + for L := 0 to Item.ItemCount - 1 do + begin + ItemNode := Items.AddChildObject(ListNode, Item[L].ResName, Item[L]); + ItemNode.ImageIndex := icoResItem; + ItemNode.SelectedIndex := icoResItem; + end; + end else + begin + ListNode.ImageIndex := icoResItem; + ListNode.SelectedIndex := icoResItem; + end; + end; + finally + Items.EndUpdate; + end; + end; +end; + +procedure TPeResViewChild.SaveResource; +var + FileStream: TFileStream; +begin + with SaveDialog1, (FSelectedItem as TPeResUnknown) do + begin + Filter := Format('*.%s files|*.%s', [FileExt, FileExt]); + FileName := ResName + '.' + FileExt; + if Execute then + begin + FileStream := TFileStream.Create(FileName, fmCreate); + try + SaveToStream(FileStream); + finally + FileStream.Free; + end; + end; + end; +end; + +procedure TPeResViewChild.DialogTestBtnClick(Sender: TObject); +var + Res: Integer; +begin + with ResourceTreeView do + while True do + begin + with TPeResDialog(FSelectedItem) do + if CanShowDialog then + Res := ShowDialog(Application.Handle) + else + Res := 1; + if (Res = 1) and (Selected.GetNextSibling <> nil) then + begin + Selected := Selected.GetNextSibling; + Selected.MakeVisible; + ResourceTreeView.Update; + end else + Break; + end; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeResource.pas b/official/1.100/examples/windows/delphitools/peviewer/PeResource.pas new file mode 100644 index 0000000..1d325d4 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeResource.pas @@ -0,0 +1,1535 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeResource.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2007-04-18 22:54:59 +0200 (mer., 18 avr. 2007) $ } +{ } +{**************************************************************************************************} + +unit PeResource; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, Classes, SysUtils, Graphics, ComCtrls, Contnrs, + JclBase, JclFileUtils, JclPeImage, JclStrings; + +type + PAccelTableEntry = ^TAccelTableEntry; + ACCELTABLEENTRY = packed record + fFlags: Word; + wAnsi: Word; + wId: Word; + padding: Word; + end; + {$EXTERNALSYM ACCELTABLEENTRY} + TAccelTableEntry = ACCELTABLEENTRY; + + PCursorDir = ^TCursorDir; + CURSORDIR = packed record + Width: Word; + Height: Word; + end; + {$EXTERNALSYM CURSORDIR} + TCursorDir = CURSORDIR; + + PCursorShape = ^TCursorShape; + _CURSORSHAPE = packed record + xHotSpot: Integer; + yHotSpot: Integer; + cx: Integer; + cy: Integer; + cbWidth: Integer; + Planes: Byte; + BitsPixel: Byte; + end; + {$EXTERNALSYM _CURSORSHAPE} + TCursorShape = _CURSORSHAPE; + CURSORSHAPE = _CURSORSHAPE; + {$EXTERNALSYM CURSORSHAPE} + + PLocalHeader = ^TLocalHeader; + _LOCALHEADER = packed record + xHotSpot: Word; + yHotSpot: Word; + end; + {$EXTERNALSYM _LOCALHEADER} + TLocalHeader = _LOCALHEADER; + LOCALHEADER = _LOCALHEADER; + {$EXTERNALSYM LOCALHEADER} + + PNewHeader = ^TNewHeader; + _NEWHEADER = packed record + Reserved: Word; + ResType: Word; + ResCount: Word; + end; + {$EXTERNALSYM _NEWHEADER} + TNewHeader = _NEWHEADER; + NEWHEADER = _NEWHEADER; + {$EXTERNALSYM NEWHEADER} + + PIconResdir = ^TIconResdir; + ICONRESDIR = packed record + Width: Byte; + Height: Byte; + ColorCount: Byte; + Reserved: Byte; + end; + {$EXTERNALSYM ICONRESDIR} + TIconResdir = ICONRESDIR; + + TResInfo = packed record + case Integer of + 0: (Icon: TIconResdir); + 1: (Cursor: TCursorDir); + end; + {$NODEFINE TResInfo} + + PResDir = ^TResDir; + _RESDIR = packed record + ResInfo: TResInfo; + Planes: Word; + BitCount: Word; + BytesInRes: DWORD; + IconCursorId: Word; + end; + {$EXTERNALSYM _RESDIR} + TResDir = _RESDIR; + RESDIR = _RESDIR; + {$EXTERNALSYM RESDIR} + + PDlgTemplate = ^TDlgTemplate; + DLGTEMPLATE = packed record + style: DWORD; + dwExtendedStyle: DWORD; + cdit: Word; + x: ShortInt; // short + y: ShortInt; + cx: ShortInt; + cy: ShortInt; + end; + {$EXTERNALSYM DLGTEMPLATE} + TDlgTemplate = DLGTEMPLATE; + + PDlgItemTemplate = ^TDlgItemTemplate; + DLGITEMTEMPLATE = packed record + style: DWORD; + dwExtendedStyle: DWORD; + x: ShortInt; + y: ShortInt; + cx: ShortInt; + cy: ShortInt; + id: Word; + end; + {$EXTERNALSYM DLGITEMTEMPLATE} + TDlgItemTemplate = DLGITEMTEMPLATE; + + PMenuHeader = ^TMenuHeader; + MENUHEADER = packed record + wVersion: Word; + cbHeaderSize: Word; + end; + {$EXTERNALSYM MENUHEADER} + TMenuHeader = MENUHEADER; + + PMenuHelpID = ^TMenuHelpID; + MENUHELPID = packed record + helpID: DWORD; + end; + {$EXTERNALSYM MENUHELPID} + TMenuHelpID = MENUHELPID; + + PNormalMenuItem = ^TNormalMenuItem; + NORMALMENUITEM = packed record + resInfo: WORD; + menuText: Pointer; // szOrOrd + end; + {$EXTERNALSYM NORMALMENUITEM} + TNormalMenuItem = NORMALMENUITEM; + + PPopupMenuItem = ^TPopupMenuItem; + POPUPMENUITEM = packed record + type_: DWORD; + state: DWORD; + id: DWORD; + resInfo: Word; + menuText: Pointer; // szOrOrd + end; + {$EXTERNALSYM POPUPMENUITEM} + TPopupMenuItem = POPUPMENUITEM; + + PMenuExTemplateHeader = ^TMenuExTemplateHeader; + MENUEX_TEMPLATE_HEADER = packed record + wVersion: Word; + wOffset: Word; + dwHelpId: DWORD; + end; + {$EXTERNALSYM MENUEX_TEMPLATE_HEADER} + TMenuExTemplateHeader = MENUEX_TEMPLATE_HEADER; + + PMenuExTemplateItem = ^TMenuExTemplateItem; + MENUEX_TEMPLATE_ITEM = packed record + dwType: DWORD; + dwState: DWORD; + uId: UINT; + bResInfo: Word; + szText: array[0..0] of WideChar; + dwHelpId: DWORD; + end; + {$EXTERNALSYM MENUEX_TEMPLATE_ITEM} + TMenuExTemplateItem = MENUEX_TEMPLATE_ITEM; + + PMessageResourceBlock = ^TMessageResourceBlock; + _MESSAGE_RESOURCE_BLOCK = packed record + LowId: ULONG; + HighId: ULONG; + OffsetToEntries: ULONG; + end; + {$EXTERNALSYM _MESSAGE_RESOURCE_BLOCK} + TMessageResourceBlock = _MESSAGE_RESOURCE_BLOCK; + MESSAGE_RESOURCE_BLOCK = _MESSAGE_RESOURCE_BLOCK; + {$EXTERNALSYM MESSAGE_RESOURCE_BLOCK} + + PMessageResourceData = ^TMessageResourceData; + _MESSAGE_RESOURCE_DATA = packed record + NumberOfBlocks: ULONG; + // Blocks: array[0..0] of TMessageResourceBlock; + end; + {$EXTERNALSYM _MESSAGE_RESOURCE_DATA} + TMessageResourceData = _MESSAGE_RESOURCE_DATA; + MESSAGE_RESOURCE_DATA = _MESSAGE_RESOURCE_DATA; + {$EXTERNALSYM MESSAGE_RESOURCE_DATA} + + PMessageResourceEntry = ^TMessageResourceEntry; + _MESSAGE_RESOURCE_ENTRY = packed record + Length: Word; + Flags: Word; + // Text: array[0..0] of Char; + end; + {$EXTERNALSYM _MESSAGE_RESOURCE_ENTRY} + TMessageResourceEntry = _MESSAGE_RESOURCE_ENTRY; + MESSAGE_RESOURCE_ENTRY = _MESSAGE_RESOURCE_ENTRY; + {$EXTERNALSYM MESSAGE_RESOURCE_ENTRY} + +(* + +Value Meaning +0x0080 Button +0x0081 Edit +0x0082 Static +0x0083 List box +0x0084 Scroll bar +0x0085 Combo box} + + PDlgTemplateEx = ^TDlgTemplateEx; + DLGTEMPLATEEX = packed record + dlgVer: WORD; + signature: WORD; + helpID: DWORD; + exStyle: DWORD; + style: DWORD; + cDlgItems: WORD; + x: short; + y: short; + cx: short; + cy: short; + sz_Or_Ord menu; // name or ordinal of a menu resource + sz_Or_Ord windowClass; // name or ordinal of a window class + WCHAR title[titleLen]; // title string of the dialog box + short pointsize; // if DS_SETFONT or DS_SHELLFONT is set + short weight; // if DS_SETFONT or DS_SHELLFONT is set + short bItalic; // if DS_SETFONT or DS_SHELLFONT is set + WCHAR font[fontLen]; // if DS_SETFONT or DS_SHELLFONT is set +} DLGTEMPLATEEX; + + + typedef struct { + DWORD helpID; + DWORD exStyle; + DWORD style; + short x; + short y; + short cx; + short cy; + WORD id; + sz_Or_Ord windowClass; // name or ordinal of a window class + sz_Or_Ord title; // title string or ordinal of a resource + WORD extraCount; // bytes of following creation data +} DLGITEMTEMPLATEEX; + +struct FONTDIRENTRY { + WORD dfVersion; + DWORD dfSize; + char dfCopyright[60]; + WORD dfType; + WORD dfPoints; + WORD dfVertRes; + WORD dfHorizRes; + WORD dfAscent; + WORD dfInternalLeading; + WORD dfExternalLeading; + BYTE dfItalic; + BYTE dfUnderline; + BYTE dfStrikeOut; + WORD dfWeight; + BYTE dfCharSet; + WORD dfPixWidth; + WORD dfPixHeight; + BYTE dfPitchAndFamily; + WORD dfAvgWidth; + WORD dfMaxWidth; + BYTE dfFirstChar; + BYTE dfLastChar; + BYTE dfDefaultChar; + BYTE dfBreakChar; + WORD dfWidthBytes; + DWORD dfDevice; + DWORD dfFace; + DWORD dfReserved; + char szDeviceName[]; + char szFaceName[]; +}; + +struct FONTGROUPHDR { + WORD NumberOfFonts; + DIRENTRY DE [1]; +}; + +*) + +type + TPeResKind = (rkAccelerator, rkAvi, rkBitmap, rkCursor, rkData, rkDialog, + rkHTML, rkIcon, rkMenu, rkMessageTable, rkString, rkVersion, rkUnknown); + + TPeResImage = class; + + TPeResItem = class; + + TPeResItem = class(TPersistent) + private + FKind: TPeResKind; + FList: TObjectList; + FResImage: TPeResImage; + FResourceItem: TJclPeResourceItem; + FStream: TJclPeResourceRawStream; + function GetItems(Index: Integer): TPeResItem; + function GetItemCount: Integer; + function GetStream: TJclPeResourceRawStream; + protected + procedure CreateList; virtual; + public + constructor Create(AResImage: TPeResImage; AResourceItem: TJclPeResourceItem); virtual; + destructor Destroy; override; + function IsList: Boolean; virtual; + function Offset: Integer; + function RawData: Pointer; + function ResName: string; virtual; + function ResType: TJclPeResourceKind; + procedure SaveToStream(Stream: TStream); virtual; + function Size: Integer; + property ItemCount: Integer read GetItemCount; + property Items[Index: Integer]: TPeResItem read GetItems; default; + property Kind: TPeResKind read FKind; + property ResourceItem: TJclPeResourceItem read FResourceItem; + property Stream: TJclPeResourceRawStream read GetStream; + end; + + TJclReResItemClass = class of TPeResItem; + + TPeResUnknown = class(TPeResItem) + public + function FileExt: string; dynamic; + function IsList: Boolean; override; + function ResName: string; override; + end; + + TPeGraphicProperties = record + Width, Height, BitsPerPixel: Integer; + end; + + TPeResUnkGraphic = class(TPeResUnknown) + public + function GraphicProperties: TPeGraphicProperties; virtual; abstract; + end; + + TPeResUnkStrings = class(TPeResUnknown) + protected + procedure AssignTo(Dest: TPersistent); override; + public + function FileExt: string; override; + procedure FillStrings(Strings: TStrings; StripCrLf: Boolean = False); virtual; abstract; + end; + + TPeResAccelerator = class(TPeResUnkStrings) + public + procedure FillStrings(Strings: TStrings; StripCrLf: Boolean = False); override; + end; + + TPeResAvi = class(TPeResUnknown) + protected + procedure AssignTo(Dest: TPersistent); override; + public + function FileExt: string; override; + end; + + TPeResBitmap = class(TPeResUnkGraphic) + protected + procedure AssignTo(Dest: TPersistent); override; + public + function GraphicProperties: TPeGraphicProperties; override; + function FileExt: string; override; + procedure SaveToStream(Stream: TStream); override; + end; + + TPeResCursorItem = class(TPeResUnkGraphic) + private + FResInfo: PResDir; + protected + procedure AssignTo(Dest: TPersistent); override; + public + function FileExt: string; override; + function GraphicProperties: TPeGraphicProperties; override; + function ResName: string; override; + procedure SaveToStream(Stream: TStream); override; + end; + + TPeResCursor = class(TPeResUnknown) + private + function GetItems(Index: Integer): TPeResCursorItem; + protected + procedure CreateList; override; + public + function IsList: Boolean; override; + property Items[Index: Integer]: TPeResCursorItem read GetItems; default; + end; + + TPeResDialog = class(TPeResUnknown) + public + function CanShowDialog: Boolean; + function ShowDialog(ParentWnd: HWND): Integer; + end; + + TPeResDataKind = (dkUnknown, dkDFM, dkPackageDescription, dkPackageInfo); + + TPeResRCData = class(TPeResUnknown) + private + FDataKind: TPeResDataKind; + protected + procedure AssignTo(Dest: TPersistent); override; + procedure CheckFormat; + procedure DFMToStrings(Strings: TStrings); + procedure PackageInfoToStrings(Strings: TStrings); + public + constructor Create(AResImage: TPeResImage; AResourceItem: TJclPeResourceItem); override; + function FileExt: string; override; + property DataKind: TPeResDataKind read FDataKind; + end; + + TPeResHTML = class(TPeResUnknown) + public + function FileExt: string; override; + function ResPath: string; + end; + + TPeResIconItem = class(TPeResCursorItem) + public + function FileExt: string; override; + function GraphicProperties: TPeGraphicProperties; override; + end; + + TPeResIcon = class(TPeResCursor) + private + function GetItems(Index: Integer): TPeResIconItem; + public + property Items[Index: Integer]: TPeResIconItem read GetItems; default; + end; + + TPeResMenu = class(TPeResUnknown) + end; + + TPeMessageTable = class(TPeResUnkStrings) + public + procedure FillStrings(Strings: TStrings; StripCrLf: Boolean = False); override; + end; + + TPeResString = class(TPeResUnkStrings) + public + procedure FillStrings(Strings: TStrings; StripCrLf: Boolean = False); override; + end; + + TPeResVersion = class(TPeResUnkStrings) + public + procedure FillStrings(Strings: TStrings; StripCrLf: Boolean = False); override; + end; + + TPeResImage = class(TObjectList) + private + FCursorEntry: TJclPeResourceList; + FIconEntry: TJclPeResourceList; + FImageAttached: Boolean; + FLibHandle: THandle; + FPeImage: TJclPeImage; + function GetFileName: TFileName; + procedure SetFileName(const Value: TFileName); + procedure SetPeImage(const Value: TJclPeImage); + function GetItems(Index: Integer): TPeResItem; + function GetLibHandle: THandle; + protected + procedure CreateList; + procedure UnloadLib; + public + constructor Create; + destructor Destroy; override; + procedure Clear; override; + property ImageAttached: Boolean read FImageAttached; + property Items[Index: Integer]: TPeResItem read GetItems; default; + property LibHandle: THandle read GetLibHandle; + property FileName: TFileName read GetFileName write SetFileName; + property PeImage: TJclPeImage read FPeImage write SetPeImage; + end; + + function LangNameFromName(const Name: string; ShortName: Boolean = False): string; + +implementation + +uses + Consts, JclLocales, JclSysUtils, JclWin32; + +resourcestring + RsPeResAccelerator = 'Accel table'; + RsPeResAVI = 'AVI'; + RsPeResBitmap = 'Bitmap'; + RsPeResCursor = 'Cursor'; + RsPeResData = 'RCData'; + RsPeResDialog = 'Dialog'; + RsPeResHTML = 'HTML'; + RsPeResIcon = 'Icon'; + RsPeResMenu = 'Menu'; + RsPeResMessageTable = 'Message table'; + RsPeResString = 'String'; + RsPeResVersion = 'Version'; + RsNeutralLang = '[Neutral]'; + RsUnknownLang = '[Unknown]'; + + RsTranslations = 'Translations:'; + +var + JclLocalesList: TJclLocalesList; + +function VirtualKeyNameFromCode(KeyCode: Byte): string; +const + KN002F: array[$00..$2F] of PChar = ( + nil, + 'LBUTTON', + 'RBUTTON', + 'CANCEL', + 'MBUTTON', + nil, nil, nil, // 05..07 + 'BACK', + 'TAB', + nil, nil, // 0A..0B + 'CLEAR', + 'RETURN', + nil, nil, // 0E..0F + 'SHIFT ', + 'CONTROL', + 'MENU', + 'PAUSE', + 'CAPITAL', + 'KANA', + 'HANGUL', + 'JUNJA', + 'FINAL', + 'HANJA', + 'KANJI', + 'ESCAPE', + 'CONVERT', + 'NONCONVERT', + 'ACCEPT', + 'MODECHANGE', + 'SPACE', + 'PRIOR', + 'NEXT', + 'END', + 'HOME', + 'LEFT', + 'UP', + 'RIGHT', + 'DOWN', + 'SELECT', + 'PRINT', + 'EXECUTE', + 'SNAPSHOT', + 'INSERT', + 'DELETE', + 'HELP' + ); + KN5B5D: array[$5B..$5D] of PChar = ( + 'LWIN', + 'RWIN', + 'APPS' + ); + KN6A6F: array[$6A..$6F] of PChar = ( + 'MULTIPLY', + 'ADD', + 'SEPARATOR', + 'SUBTRACT', + 'DECIMAL', + 'DIVIDE' + ); + KNA0A5: array[$A0..$A5] of PChar = ( + 'LSHIFT', + 'RSHIFT', + 'LCONTROL', + 'RCONTROL', + 'LMENU', + 'RMENU' + ); + KNF6FE: array[$F6..$FE] of PChar = ( + 'ATTN', + 'CRSEL', + 'EXSEL', + 'EREOF', + 'PLAY', + 'ZOOM', + 'NONAME', + 'PA1', + 'OEM_CLEAR' + ); +begin + case KeyCode of + $00..$2F: + Result := KN002F[KeyCode]; + $30..$39, $41..$5A: + Result := Chr(KeyCode); + $5B..$5D: + Result := KN5B5D[KeyCode]; + $60..$69: + Result := Format('NUMPAD%d', [KeyCode - $60]); + $6A..$6F: + Result := KN6A6F[KeyCode]; + $70..$87: + Result := Format('F%d', [KeyCode - $6F]); + $90: + Result := 'NUMLOCK'; + $91: + Result := 'SCROLL'; + $A0..$A5: + Result := KNA0A5[KeyCode]; + $E5: + Result := 'PROCESSKEY'; + $F6..$FE: + Result := KNF6FE[KeyCode]; + else + Result := ''; + end; + if Result <> '' then Result := 'VK_' + Result; +end; + +function LangNameFromName(const Name: string; ShortName: Boolean): string; +var + LangID: Word; + Locale: TJclLocaleInfo; +begin + LangID := PRIMARYLANGID(StrToIntDef(Name, 0)); + if LangID = LANG_NEUTRAL then + if ShortName then Result := '' else Result := RsNeutralLang + else + begin + Locale := JclLocalesList.ItemFromLangIDPrimary[LangID]; + if Locale <> nil then + with Locale do if ShortName then + Result := AbbreviatedLangName else Result := EnglishLangName + else + Result := RsUnknownLang; + end; +end; + + +function GetResItemKind(Item: TJclPeResourceItem; var Kind: TPeResKind): Boolean; +begin + Result := True; + Kind := rkUnknown; + with Item do + case ResourceType of + rtAccelerators: + Kind := rkAccelerator; + rtCursorEntry, rtIconEntry, rtFont: + Result := False; + rtUserDefined: + begin + if Name = 'AVI' then Kind := rkAvi; + if Name = '2110' then Kind := rkHTML; + end; + rtBitmap: + Kind := rkBitmap; + rtMenu: + Kind := rkMenu; + rtDialog: + Kind := rkDialog; + rtString: + Kind := rkString; + rtRCData: + Kind := rkData; + rtMessageTable: + Kind := rkMessageTable; + rtCursor: + Kind := rkCursor; + rtIcon: + Kind := rkIcon; + rtVersion: + Kind := rkVersion; + rtHmtl: + Kind := rkHTML; + end; +end; + +const + ResItemClasses: array [TPeResKind] of TJclReResItemClass = ( + TPeResAccelerator, + TPeResAvi, + TPeResBitmap, + TPeResCursor, + TPeResRCData, + TPeResDialog, + TPeResHTML, + TPeResIcon, + TPeResMenu, + TPeMessageTable, + TPeResString, + TPeResVersion, + TPeResUnknown + ); + +function WideCharToStr(WStr: PWChar; Len: Integer): string; +begin + if Len = 0 then Len := -1; + Len := WideCharToMultiByte(CP_ACP, 0, WStr, Len, nil, 0, nil, nil); + SetLength(Result, Len); + WideCharToMultiByte(CP_ACP, 0, WStr, Len, PChar(Result), Len, nil, nil); +end; + +{ TPeResItem } + +constructor TPeResItem.Create(AResImage: TPeResImage; AResourceItem: TJclPeResourceItem); +begin + FList := TObjectList.Create(True); + FResImage := AResImage; + FResourceItem := AResourceItem; +end; + +procedure TPeResItem.CreateList; +var + I, J: Integer; + Item: TPeResItem; + ResItem: TJclPeResourceItem; +begin + with FResourceItem.List do + for I := 0 to Count - 1 do + begin + ResItem := Items[I]; + for J := 0 to ResItem.List.Count - 1 do + begin + Item := ResItemClasses[Self.FKind].Create(FResImage, ResItem.List[J]); + Item.FKind := Self.FKind; + FList.Add(Item); + end; + end; +end; + +destructor TPeResItem.Destroy; +begin + FreeAndNil(FList); + FreeAndNil(FStream); + inherited; +end; + +function TPeResItem.GetItemCount: Integer; +begin + if IsList then + begin + if FList.Count = 0 then CreateList; + Result := FList.Count; + end else + Result := -1; +end; + +function TPeResItem.GetItems(Index: Integer): TPeResItem; +begin + Result := TPeResItem(FList[Index]); +end; + +function TPeResItem.GetStream: TJclPeResourceRawStream; +begin + if not Assigned(FStream) then + FStream := TJclPeResourceRawStream.Create(FResourceItem); + Result := FStream; +end; + +function TPeResItem.IsList: Boolean; +begin + Result := FResourceItem.IsDirectory; +end; + +function TPeResItem.Offset: Integer; +begin + if IsList then + Result := FResourceItem.Entry^.OffsetToData and not (IMAGE_RESOURCE_DATA_IS_DIRECTORY) + else + Result := FResourceItem.DataEntry^.OffsetToData +end; + +function TPeResItem.RawData: Pointer; +begin + Result := FResourceItem.RawEntryData; +end; + +function TPeResItem.ResName: string; +const + ResNames: array [TPeResKind] of PResStringRec = ( + @RsPeResAccelerator, + @RsPeResAVI, + @RsPeResBitmap, + @RsPeResCursor, + @RsPeResData, + @RsPeResDialog, + @RsPeResHTML, + @RsPeResIcon, + @RsPeResMenu, + @RsPeResMessageTable, + @RsPeResString, + @RsPeResVersion, + nil + ); +begin + if FKind = rkUnknown then + Result := FResourceItem.ResourceTypeStr + else + Result := LoadResString(ResNames[FKind]); +end; + +function TPeResItem.ResType: TJclPeResourceKind; +begin + Result := FResourceItem.ResourceType; +end; + +procedure TPeResItem.SaveToStream(Stream: TStream); +begin + if not IsList then + Stream.WriteBuffer(RawData^, Size); +end; + +function TPeResItem.Size: Integer; +begin + if IsList then + Result := 0 + else + Result := FResourceItem.DataEntry^.Size; +end; + +{ TPeResUnknown } + +function TPeResUnknown.FileExt: string; +begin + Result := 'bin'; +end; + +function TPeResUnknown.IsList: Boolean; +begin + Result := False; +end; + +function TPeResUnknown.ResName: string; +begin + if StrToIntDef(FResourceItem.Name, 0) = LANG_NEUTRAL then + Result := FResourceItem.ParentItem.Name + else + Result := Format('%s > %s', [FResourceItem.ParentItem.Name, LangNameFromName(FResourceItem.Name)]); +end; + +{ TPeResUnkStrings } + +procedure TPeResUnkStrings.AssignTo(Dest: TPersistent); +begin + if (Dest is TStrings) then + with TStrings(Dest) do + begin + BeginUpdate; + try + Clear; + FillStrings(TStrings(Dest)); + finally + EndUpdate; + end; + end + else + inherited; +end; + +function TPeResUnkStrings.FileExt: string; +begin + Result := 'txt'; +end; + +{ TPeResAccelTable } + +procedure TPeResAccelerator.FillStrings(Strings: TStrings; StripCrLf: Boolean); +var + TableEntry: PAccelTableEntry; + IsLast: Boolean; + S: string; + + function AnsiToChar(A: Word): string; + begin + if A >= 32 then Result := Chr(A) else Result := ''; + end; + +begin + Strings.BeginUpdate; + try + TableEntry := RawData; + repeat + with TableEntry^ do + begin + IsLast := fFlags and $80 <> 0; + if fFlags and FVIRTKEY <> 0 then + begin + S := Format('Virtual Key: %.2u "%s" ', [wAnsi, VirtualKeyNameFromCode(wAnsi)]); + if fFlags and FSHIFT <> 0 then S := S + 'SHIFT '; + if fFlags and FCONTROL <> 0 then S := S + 'CTRL '; + if fFlags and FALT <> 0 then S := S + 'ALT '; + end else + S := Format('ANSI character: %.2u "%s" ', [wAnsi, AnsiToChar(wAnsi)]); + if fFlags and FNOINVERT <> 0 then S := S + 'NOINVERT'; + end; + Strings.Add(TrimRight(S)); + Inc(TableEntry); + until IsLast; + finally + Strings.EndUpdate; + end; +end; + +{ TPeResAvi } + +{$HINTS OFF} +type + TDirtyComponent = class(TPersistent) + private + FOwner: TComponent; + FName: TComponentName; + FTag: Longint; + FComponents: TList; + FFreeNotifies: TList; + FDesignInfo: Longint; + FVCLComObject: Pointer; + FComponentState: TComponentState; + end; +{$HINTS ON} + +procedure TPeResAvi.AssignTo(Dest: TPersistent); +begin + if Dest is TAnimate then + begin + Include(TDirtyComponent(Dest).FComponentState, csLoading); + TAnimate(Dest).ResHandle := FResImage.LibHandle; + TAnimate(Dest).ResName := FResourceItem.ParentItem.ParameterName; + Exclude(TDirtyComponent(Dest).FComponentState, csLoading); + TAnimate(Dest).Reset; + end + else + inherited; +end; + +function TPeResAvi.FileExt: string; +begin + Result := 'avi'; +end; + +{ TPeResBitmap } + +procedure TPeResBitmap.AssignTo(Dest: TPersistent); +var + MemStream: TMemoryStream; + BitMap: TBitMap; +begin + if Dest is TPicture then + begin + BitMap := TPicture(Dest).Bitmap; + MemStream := TMemoryStream.Create; + try + SaveToStream(MemStream); + MemStream.Seek(0, soFromBeginning); + BitMap.LoadFromStream(MemStream); + finally + MemStream.Free; + end + end + else + inherited; +end; + +function TPeResBitmap.FileExt: string; +begin + Result := 'bmp'; +end; + +function TPeResBitmap.GraphicProperties: TPeGraphicProperties; +var + BI: PBitmapInfoHeader; + BC: PBitmapCoreHeader; +begin + BI := PBitmapInfoHeader(RawData); + if BI.biSize = SizeOf(TBitmapInfoHeader) then + begin + Result.Width := BI.biWidth; + Result.Height := BI.biHeight; + Result.BitsPerPixel := BI.biPlanes * BI.biBitCount; + end else + begin + BC := PBitmapCoreHeader(RawData); + Result.Width := BC.bcWidth; + Result.Height := BC.bcHeight; + Result.BitsPerPixel := BC.bcPlanes * BC.bcBitCount; + end; +end; + +procedure TPeResBitmap.SaveToStream(Stream: TStream); + + function GetDInColors(BitCount: Word): Integer; + begin + case BitCount of + 1, 4, 8: Result := 1 shl BitCount; + else + Result := 0; + end; + end; + +var + BH: TBitmapFileHeader; + BI: PBitmapInfoHeader; + BC: PBitmapCoreHeader; + ClrUsed: Integer; +begin + FillChar(BH, sizeof(BH), #0); + BH.bfType := $4D42; + BH.bfSize := Size + SizeOf(BH); + BI := PBitmapInfoHeader(RawData); + if BI.biSize = SizeOf(TBitmapInfoHeader) then + begin + ClrUsed := BI.biClrUsed; + if ClrUsed = 0 then ClrUsed := GetDInColors(BI.biBitCount); + BH.bfOffBits := ClrUsed * SizeOf(TRgbQuad) + SizeOf(TBitmapInfoHeader) + SizeOf(BH); + end + else + begin + BC := PBitmapCoreHeader(RawData); + ClrUsed := GetDInColors(BC.bcBitCount); + BH.bfOffBits := ClrUsed * SizeOf(TRGBTriple) + SizeOf(TBitmapCoreHeader) + SizeOf(BH); + end; + Stream.Write(BH, SizeOf(BH)); + Stream.Write(RawData^, Size); +end; + +{ TPeResCursorItem } + +procedure TPeResCursorItem.AssignTo(Dest: TPersistent); +begin + if Dest is TPicture then + TPicture(Dest).Icon.Handle := CreateIconFromResource(RawData, Size, ResType = rtIconEntry, $30000) + else + inherited; +end; + +function TPeResCursorItem.FileExt: string; +begin + Result := 'cur'; +end; + +function TPeResCursorItem.GraphicProperties: TPeGraphicProperties; +begin + with FResInfo^ do + begin + Result.Width := ResInfo.Cursor.Width; + Result.Height := ResInfo.Cursor.Height; + Result.BitsPerPixel := BitCount * Planes; + end; +end; + +function TPeResCursorItem.ResName: string; +begin + if FResInfo <> nil then + with GraphicProperties do + Result := Format('%d X %d %d bpp', [Width, Height, BitsPerPixel]) + else + Result := ''; +end; + +procedure TPeResCursorItem.SaveToStream(Stream: TStream); +begin + with TIcon.Create do + try + Handle := CreateIconFromResource(RawData, Self.Size, ResType = rtIconEntry, $30000); + SaveToStream(Stream); + finally + Free; + end; +end; +{ TODO : Saving monochrome icons and cursors doesn't work } + +{ TPeResCursor } + +procedure TPeResCursor.CreateList; +var + Item: TPeResItem; + I, J, Cnt: Integer; + ResData: PResDir; + ResOrd: DWORD; + ResList: TJclPeResourceList; + ItemClass: TJclReResItemClass; +begin + if ResType = rtCursor then + begin + ResList := FResImage.FCursorEntry; + ItemClass := TPeResCursorItem; + end else + begin + ResList := FResImage.FIconEntry; + ItemClass := TPeResIconItem; + end; + ResData := RawData; + Cnt := PNewHeader(ResData)^.ResCount; + Inc(PNewHeader(ResData)); + for I := 1 to Cnt do + begin + ResOrd := ResData^.IconCursorId; + for J := 0 to ResList.Count - 1 do + if ResOrd = ResList[J].Entry^.Name then + begin + Item := ItemClass.Create(FResImage, ResList[J].List[0]); + Item.FKind := Self.FKind; + TPeResCursorItem(Item).FResInfo := ResData; + FList.Add(Item); + end; + Inc(ResData); + end; +end; + +function TPeResCursor.GetItems(Index: Integer): TPeResCursorItem; +begin + Result := TPeResCursorItem(FList[Index]); +end; + +function TPeResCursor.IsList: Boolean; +begin + Result := True; +end; + +{ TPeResRCData } + +procedure TPeResRCData.AssignTo(Dest: TPersistent); +begin + if Dest is TStrings then + with TStrings(Dest) do + begin + BeginUpdate; + try + Clear; + case FDataKind of + dkDFM: + DFMToStrings(TStrings(Dest)); + dkPackageDescription: + Add(PWideChar(RawData)); + dkPackageInfo: + PackageInfoToStrings(TStrings(Dest)); + end; + finally + EndUpdate; + end; + end else + inherited; +end; + +procedure TPeResRCData.CheckFormat; +{$IFNDEF DELPHI5_UP} +const + FilerSignature: array[1..4] of Char = 'TPF0'; +var + Signature: Integer; +{$ENDIF DELPHI5_UP} +begin + FDataKind := dkUnknown; + if ResName = 'DESCRIPTION' then + FDataKind := dkPackageDescription + else + if ResName = 'PACKAGEINFO' then + FDataKind := dkPackageInfo + else + begin + Stream.Seek(0, soFromBeginning); + {$IFDEF DELPHI5_UP} + if TestStreamFormat(Stream) = sofBinary then + FDataKind := dkDFM; + {$ELSE DELPHI5_UP} + Signature := 0; + Stream.Read(Signature, SizeOf(Signature)); + if (Byte(Signature) = $FF) or (Signature = Integer(FilerSignature)) then + FDataKind := dkDFM; + {$ENDIF DELPHI5_UP} + end; +end; + +constructor TPeResRCData.Create(AResImage: TPeResImage; + AResourceItem: TJclPeResourceItem); +begin + inherited; + CheckFormat; +end; + +procedure TPeResRCData.DFMToStrings(Strings: TStrings); +var + MemStream: TMemoryStream; +begin + MemStream := TMemoryStream.Create; + try + Stream.Seek(0, soFromBeginning); + ObjectBinaryToText(Stream, MemStream); + MemStream.Seek(0, soFromBeginning); + Strings.LoadFromStream(MemStream); + finally + MemStream.Free; + end; +end; + +function TPeResRCData.FileExt: string; +begin + if DataKind = dkDFM then + Result := 'dfm' + else + Result := inherited FileExt; +end; + +procedure TPeResRCData.PackageInfoToStrings(Strings: TStrings); +var + I: Integer; +begin + with TJclPePackageInfo.Create(FResImage.LibHandle) do + try + Strings.Add('Contains'); + Strings.Add(StringOfChar('-', 80)); + for I := 0 to ContainsCount - 1 do + Strings.Add(Format(' %s [%s]', [ContainsNames[I], UnitInfoFlagsToString(ContainsFlags[I])])); + if RequiresCount > 0 then + begin + Strings.Add(''); + Strings.Add('Requires'); + Strings.Add(StringOfChar('-', 80)); + for I := 0 to RequiresCount - 1 do + Strings.Add(Format(' %s', [RequiresNames[I]])); + end; + Strings.Add(''); + Strings.Add('Package Info flags'); + Strings.Add(StringOfChar('-', 80)); + Strings.Add(Format('Options : %s', [PackageOptionsToString(Flags)])); + Strings.Add(Format('Module type: %s', [PackageModuleTypeToString(Flags)])); + Strings.Add(Format('Producer : %s', [ProducerToString(Flags)])); + finally + Free; + end; +end; + +{ TPeResDialog } + +function TPeResDialog.CanShowDialog: Boolean; +begin + Result := Windows.PDlgTemplate(RawData)^.style and DS_CONTROL = 0; +end; + +function TPeResDialog.ShowDialog(ParentWnd: HWND): Integer; +var + LastFocus: HWND; + MemHandle: THandle; + P: Windows.PDlgTemplate; + + function DialogProc(hwndDlg: HWND; uMsg: UINT; W: WPARAM; L: LPARAM): BOOL; stdcall; + begin + Result := False; + case uMsg of + WM_INITDIALOG: + Result := True; + WM_LBUTTONDBLCLK: + EndDialog(hwndDlg, 0); + WM_RBUTTONUP: + EndDialog(hwndDlg, 1); + WM_SYSCOMMAND: + if W and $FFF0 = SC_CLOSE then + EndDialog(hwndDlg, 0); + end; + end; + +begin + LastFocus := GetFocus; + MemHandle := GlobalAlloc(GMEM_ZEROINIT, Size); + P := GlobalLock(MemHandle); + Move(RawData^, P^, Size); + GlobalUnlock(MemHandle); + Result := DialogBoxIndirect(hinstance, Windows.PDlgTemplate(MemHandle)^, + ParentWnd, @DialogProc); + GlobalFree(MemHandle); + SetFocus(LastFocus); +end; + +{ TPeResHTML } + +function TPeResHTML.FileExt: string; +begin + Result := Copy(ExtractFileExt(FResourceItem.ParentItem.ParameterName), 2, 20); +end; + +function TPeResHTML.ResPath: string; +begin + Result := Format('res://%s/%s', [FResImage.FileName, FResourceItem.ParentItem.ParameterName]); +end; + +{ TPeResIconItem } + +function TPeResIconItem.FileExt: string; +begin + Result := 'ico'; +end; + +function TPeResIconItem.GraphicProperties: TPeGraphicProperties; +begin + with FResInfo^ do + begin + Result.Width := ResInfo.Icon.Width; + Result.Height := ResInfo.Icon.Height; + Result.BitsPerPixel := BitCount * Planes; + end; +end; + +{ TPeResIcon } + +function TPeResIcon.GetItems(Index: Integer): TPeResIconItem; +begin + Result := TPeResIconItem(FList[Index]); +end; + +{ TPeMessageTable } + +procedure TPeMessageTable.FillStrings(Strings: TStrings; StripCrLf: Boolean); +var + Count, I: Integer; + E: DWORD; + Block: PMessageResourceBlock; + Entry: PMessageResourceEntry; + S: string; + Text: PChar; + Data: Pointer; +begin + Data := RawData; + Count := PMessageResourceData(Data)^.NumberOfBlocks; + Block := Data; + Inc(PMessageResourceData(Block)); + for I := 1 to Count do + begin + Entry := PMessageResourceEntry(DWORD(Data) + Block^.OffsetToEntries); + for E := Block^.LowId to Block^.HighId do + begin + with Entry^ do + begin + Text := PChar(Entry) + Sizeof(TMessageResourceEntry); + if Flags = 1 then + S := WideCharToStr(PWideChar(Text), lstrlenW(PWideChar(Text))) + else + SetString(S, PAnsiChar(Text), StrLen(Text)); + if StripCrLf then S := StrRemoveChars(S, [AnsiCarriageReturn, AnsiLineFeed]); + Strings.AddObject(S, Pointer(E)); + end; + Entry := Pointer(PChar(Entry) + Entry^.Length); + end; + Inc(Block); + end; +end; + +{ TPeResString } + +procedure TPeResString.FillStrings(Strings: TStrings; StripCrLf: Boolean); +var + P: PWChar; + ID: Integer; + Cnt: Cardinal; + Len: Word; + S: string; +begin + P := RawData; + Cnt := 0; + while Cnt < 16 do + begin + Len := Word(P^); + if Len > 0 then + begin + Inc(P); + ID := ((FResourceItem.ParentItem.Entry^.Name - 1) shl 4) + Cnt; + S := WideCharToStr(P, Len); + if StripCrLf then S := StrRemoveChars(S, [AnsiCarriageReturn, AnsiLineFeed]); + Strings.AddObject(S, Pointer(ID)); + Inc(P, Len); + end else + Inc(P); + Inc(Cnt); + end; +end; + +{ TPeResVersion } + +procedure TPeResVersion.FillStrings(Strings: TStrings; StripCrLf: Boolean); +var + I: Integer; +begin + Strings.Clear; + with TJclFileVersionInfo.Attach(RawData, Size) do + try + for I := 0 to LanguageCount - 1 do + begin + LanguageIndex := I; + Strings.Add(Format('[%s] %s', [LanguageIds[I], LanguageNames[I]])); + Strings.Add(StringOfChar('-', 80)); + Strings.AddStrings(Items); + Strings.Add(BinFileVersion); + Strings.Add(OSIdentToString(FileOS)); + Strings.Add(OSFileTypeToString(FileType, FileSubType)); + Strings.Add(''); + end; + Strings.Add(RsTranslations); + for I := 0 to TranslationCount - 1 do + Strings.Add(VersionLanguageId(Translations[I])); + finally + Free; + end; +end; + +{ TPeResImage } + +procedure TPeResImage.Clear; +begin + inherited; + if Assigned(FPeImage) then + begin + if not FImageAttached then FreeAndNil(FPeImage) else FPeImage := nil; + end; +end; + +constructor TPeResImage.Create; +begin + inherited Create(True); +end; + +procedure TPeResImage.CreateList; +var + I: Integer; + Kind: TPeResKind; + Item: TJclPeResourceItem; + ResItem: TPeResItem; +begin + with FPeImage.ResourceList do + for I := 0 to Count - 1 do + begin + Item := Items[I]; + if GetResItemKind(Item, Kind) then + begin + ResItem := TPeResItem.Create(Self, Item); + ResItem.FKind := Kind; + Self.Add(ResItem); + end else + case Item.ResourceType of + rtCursorEntry: + FCursorEntry := Item.List; + rtIconEntry: + FIconEntry := Item.List; + end; + end; +end; + +destructor TPeResImage.Destroy; +begin + UnloadLib; + inherited; +end; + +function TPeResImage.GetFileName: TFileName; +begin + if Assigned(FPeImage) then Result := FPeImage.FileName else Result := ''; +end; + +function TPeResImage.GetItems(Index: Integer): TPeResItem; +begin + Result := TPeResItem(inherited Items[Index]); +end; + +function TPeResImage.GetLibHandle: THandle; +begin + if FLibHandle = 0 then + begin + FLibHandle := LoadLibraryEx(PChar(FileName), 0, LOAD_LIBRARY_AS_DATAFILE); + if FLibHandle = 0 then RaiseLastOSError; + end; + Result := FLibHandle; +end; + +procedure TPeResImage.SetFileName(const Value: TFileName); +begin + if FileName <> Value then + begin + Clear; + FImageAttached := False; + FPeImage := TJclPeImage.Create; + FPeImage.FileName := Value; + CreateList; + end; +end; + +procedure TPeResImage.SetPeImage(const Value: TJclPeImage); +begin + Clear; + FPeImage := Value; + FImageAttached := True; + CreateList; +end; + +procedure TPeResImage.UnloadLib; +begin + if FLibHandle <> 0 then + begin + FreeLibrary(FLibHandle); + FLibHandle := 0; + end; +end; + +initialization + JclLocalesList := TJclLocalesList.Create; + +finalization + FreeAndNil(JclLocalesList); + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeSearch.dfm b/official/1.100/examples/windows/delphitools/peviewer/PeSearch.dfm new file mode 100644 index 0000000..272339e --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeSearch.dfm @@ -0,0 +1,162 @@ +object PeSearchChild: TPeSearchChild + Left = 259 + Top = 176 + AutoScroll = False + Caption = 'Search function' + ClientHeight = 265 + ClientWidth = 397 + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 300 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = False + Position = poDefaultPosOnly + Visible = True + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object ProcessLabel: TLabel + Left = 8 + Top = 80 + Width = 64 + Height = 13 + Caption = 'ProcessLabel' + end + object Bevel1: TBevel + Left = 0 + Top = 56 + Width = 398 + Height = 18 + Anchors = [akLeft, akTop, akRight] + Shape = bsBottomLine + end + object CountLabel: TLabel + Left = 334 + Top = 81 + Width = 54 + Height = 13 + Alignment = taRightJustify + Anchors = [akTop, akRight] + Caption = 'CountLabel' + end + object Label1: TLabel + Left = 6 + Top = 12 + Width = 31 + Height = 13 + Caption = '&Name:' + FocusControl = FuncNameEdit + end + object Label2: TLabel + Left = 6 + Top = 44 + Width = 25 + Height = 13 + Caption = '&Path:' + FocusControl = PathEdit + end + object FuncNameEdit: TEdit + Left = 40 + Top = 8 + Width = 155 + Height = 21 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + CharCase = ecUpperCase + TabOrder = 0 + OnChange = FuncNameEditChange + end + object ResultListView: TListView + Left = 0 + Top = 104 + Width = 397 + Height = 161 + Anchors = [akLeft, akTop, akRight, akBottom] + Columns = < + item + Caption = 'Name' + Width = 90 + end + item + Caption = 'Filename' + Width = 300 + end> + ColumnClick = False + MultiSelect = True + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnDblClick = ResultListViewDblClick + end + object StartBtn: TButton + Left = 318 + Top = 8 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Start' + Default = True + TabOrder = 2 + OnClick = StartBtnClick + end + object StopBtn: TButton + Left = 318 + Top = 40 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Cancel = True + Caption = 'Stop' + Enabled = False + TabOrder = 3 + OnClick = StopBtnClick + end + object PathEdit: TEdit + Left = 40 + Top = 40 + Width = 251 + Height = 21 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + CharCase = ecUpperCase + TabOrder = 4 + OnChange = FuncNameEditChange + end + object SelectDirBtn: TButton + Left = 295 + Top = 40 + Width = 13 + Height = 21 + Anchors = [akTop, akRight] + Caption = '...' + TabOrder = 5 + OnClick = SelectDirBtnClick + end + object ExportCheckBox: TCheckBox + Left = 203 + Top = 8 + Width = 49 + Height = 17 + Anchors = [akTop, akRight] + Caption = '&Export' + TabOrder = 6 + OnClick = FuncNameEditChange + end + object ImportCheckBox: TCheckBox + Left = 260 + Top = 8 + Width = 49 + Height = 17 + Anchors = [akTop, akRight] + Caption = '&Import' + TabOrder = 7 + OnClick = FuncNameEditChange + end +end diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeSearch.pas b/official/1.100/examples/windows/delphitools/peviewer/PeSearch.pas new file mode 100644 index 0000000..56cc4d0 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeSearch.pas @@ -0,0 +1,226 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeSearch.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit PeSearch; + +{$I JCL.INC} + +{$IFDEF COMPILER6_UP} + {$WARN UNIT_PLATFORM OFF} +{$ENDIF COMPILER6_UP} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ComCtrls, JclPeImage, ExtCtrls; + +type + TPeSearchChild = class(TForm) + FuncNameEdit: TEdit; + ResultListView: TListView; + StartBtn: TButton; + ProcessLabel: TLabel; + StopBtn: TButton; + Bevel1: TBevel; + PathEdit: TEdit; + CountLabel: TLabel; + SelectDirBtn: TButton; + Label1: TLabel; + Label2: TLabel; + ExportCheckBox: TCheckBox; + ImportCheckBox: TCheckBox; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure StartBtnClick(Sender: TObject); + procedure StopBtnClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure SelectDirBtnClick(Sender: TObject); + procedure FuncNameEditChange(Sender: TObject); + procedure ResultListViewDblClick(Sender: TObject); + private + FSearchThread: TJclPeNameSearch; + procedure SearchDone(Sender: TObject); + procedure SearchFound(Sender: TObject; const FileName: TFileName; + const FunctionName: string; Option: TJclPeNameSearchOption); + procedure SearchProcessFile(Sender: TObject; PeImage: TJclPeImage; var Process: Boolean); + procedure UpdateCounter; + procedure UpdateButtons; + public + function ActiveLibName: string; + procedure ClearResults; + procedure StartSearch; + procedure StopSearch; + end; + +var + PeSearchChild: TPeSearchChild; + +implementation + +{$R *.DFM} + +uses + FileCtrl, JclSysInfo, PeViewerMain; + +procedure TPeSearchChild.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if Assigned(FSearchThread) then + begin + FSearchThread.OnFound := nil; + FSearchThread.OnProcessFile := nil; + FSearchThread.OnTerminate := nil; + FSearchThread.Terminate; + end; + Action := caFree; +end; + +procedure TPeSearchChild.SearchDone(Sender: TObject); +begin + FSearchThread := nil; + UpdateButtons; + ProcessLabel.Caption := ''; +end; + +procedure TPeSearchChild.SearchFound(Sender: TObject; const FileName: TFileName; + const FunctionName: string; Option: TJclPeNameSearchOption); +begin + with ResultListView.Items.Add do + begin + Caption := FunctionName; + SubItems.Add(FileName); + case Option of + seImports: ImageIndex := icoImports; + seDelayImports: ImageIndex := icoDelayImport; + seBoundImports: ImageIndex := icoBoundImport; + seExports: ImageIndex := icoExports; + end; + end; + UpdateCounter; +end; + +procedure TPeSearchChild.SearchProcessFile(Sender: TObject; PeImage: TJclPeImage; var Process: Boolean); +begin + ProcessLabel.Caption := PeImage.FileName; +end; + +procedure TPeSearchChild.StartSearch; +var + Options: TJclPeNameSearchOptions; +begin + Options := []; + if ExportCheckBox.Checked then Include(Options, seExports); + if ImportCheckBox.Checked then Options := Options + [seImports, seDelayImports, seBoundImports]; + FSearchThread := TJclPeNameSearch.Create(Trim(FuncNameEdit.Text), + PathEdit.Text, Options); + FSearchThread.OnTerminate := SearchDone; + FSearchThread.OnFound := SearchFound; + FSearchThread.OnProcessFile := SearchProcessFile; + UpdateButtons; + ClearResults; + FSearchThread.Resume; +end; + +procedure TPeSearchChild.StopSearch; +begin + FSearchThread.Terminate; +end; + +procedure TPeSearchChild.StartBtnClick(Sender: TObject); +begin + StartSearch; +end; + +procedure TPeSearchChild.StopBtnClick(Sender: TObject); +begin + StopSearch; +end; + +procedure TPeSearchChild.FormCreate(Sender: TObject); +begin + ProcessLabel.Caption := ''; + PathEdit.Text := GetWindowsSystemFolder; + UpdateButtons; + UpdateCounter; +end; + +procedure TPeSearchChild.SelectDirBtnClick(Sender: TObject); +var + S: string; +begin + if SelectDirectory('', '', S) then PathEdit.Text := S; +end; + +procedure TPeSearchChild.ClearResults; +begin + with ResultListView.Items do + begin + BeginUpdate; + Clear; + EndUpdate; + end; + UpdateCounter; +end; + +procedure TPeSearchChild.UpdateCounter; +begin + with ResultListView.Items do + if Count = 0 then + CountLabel.Caption := '' + else + CountLabel.Caption := Format('%d', [Count]); +end; + +procedure TPeSearchChild.UpdateButtons; +begin + StartBtn.Enabled := (FuncNameEdit.Text <> '') and (PathEdit.Text <> '') and + (ImportCheckBox.Checked or ExportCheckBox.Checked) and + not Assigned(FSearchThread); + StopBtn.Enabled := Assigned(FSearchThread); + FuncNameEdit.Enabled := not Assigned(FSearchThread); + PathEdit.Enabled := not Assigned(FSearchThread); + SelectDirBtn.Enabled := not Assigned(FSearchThread); + ExportCheckBox.Enabled := not Assigned(FSearchThread); + ImportCheckBox.Enabled := not Assigned(FSearchThread); +end; + +procedure TPeSearchChild.FuncNameEditChange(Sender: TObject); +begin + UpdateButtons; +end; + +function TPeSearchChild.ActiveLibName: string; +begin + if ResultListView.Selected <> nil then + Result := ResultListView.Selected.SubItems[0] + else + Result := ''; +end; + +procedure TPeSearchChild.ResultListViewDblClick(Sender: TObject); +begin + MainForm.OpenLibrary1.Execute; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dof b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dof new file mode 100644 index 0000000..bc483da --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dof @@ -0,0 +1,134 @@ +[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= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=0 +MinorVer=5 +Release=4 +Build=129 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Petr Vones +FileDescription=PE Viewer +FileVersion=0.5.4.129 +InternalName=PEVIEWER +LegalCopyright=(c) 2002 Petr Vones +LegalTrademarks= +OriginalFilename=PEVIEWER.EXE +ProductName=PE Viewer +ProductVersion=0.5.4 diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dpr b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dpr new file mode 100644 index 0000000..7a9b5a8 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.dpr @@ -0,0 +1,33 @@ +program PeViewer; + +{$I jcl.inc} + +uses + Forms, + SysUtils, + D6MdiMsgFix in '..\Common\D6MdiMsgFix.pas', + PeViewerMain in 'PeViewerMain.pas' {MainForm}, + PeDump in 'PeDump.pas' {PeDumpChild}, + PeSearch in 'PeSearch.pas' {PeSearchChild}, + PeViewer_TLB in 'PeViewer_TLB.pas', + PeViewerControl in 'PeViewerControl.pas' {PeViewerControl: CoClass}, + PeResource in 'PeResource.pas', + PeResView in 'PeResView.pas' {PeResViewChild}, + ToolsUtils in '..\Common\ToolsUtils.pas', + About in '..\Common\About.pas' {AboutBox}, + PeGenDef in 'PeGenDef.pas' {PeGenDefChild}, + FindDlg in '..\Common\FindDlg.pas' {FindTextForm}, + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}, + SHDocVw_TLB in '..\Common\SHDocVw_TLB.pas'; + +{$R *.TLB} + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'PE Viewer'; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewer.res b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.res new file mode 100644 index 0000000000000000000000000000000000000000..26d12ee208fe5fd938fc6c0275c25dd389f3bc7a GIT binary patch literal 1636 zcmd^;yKWOv5QcvThbR!hg?qN32o#Zt3?dRzfLx?VfmjJLbdeQ|iEwPoF+z0axf~?- z*#}5TK|u#41;TtY$D3UT7gRKiJZH|#{BvC&Ns8dnC@|Lv`Z|;NFM-LquTYrFC!j?x z5&Q_wDVY1jOsBrYPyK!noLu3)hQlEaYr@1R2+q)#8ULhsOk+^aQ6HT#r*dHb2qsH&m(z>sU9Jqy9<{wNpI76Y>A0&L?7vzQ3>y41-h;J8|7G zDcL{cr?mP*y7^tYVfw2ok+R`(4O*_bhvhTuPLrzgt@K<54D5taY zw^YcyrP+KEe>PL*TGgKRIXAS+ZObd{d%aEWMxXNEep$X*?jMyum#gj-7V}Qh1Amiy z>Zz+kwbalivZ*?mTY9ZF@S=)SI!Zw<_mI;w&Hz|=Lgx)-S+EpJ5E zZM=0IyZxcA5SP?hcl&|Y?|?satN|<3vDiZp@8K@C@)o0(3nP8I)#UckFnTH7iTvkkuCXq&Rbe72>A-jGRJ)PZi(;W9fZaYl4J zZQ?s*%I11bmYQCHJwkT%cDxs>`$X5k?u_f$7qMQGU6~fPd$H#wI)4cpg&kGM(Wc5f xy6k19oxazSE>m|h=HhnK-Ae0Tsp|bF-KGB+>6ZW7!lW(cYl6&v+xh&L{BOou!B_wQ literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewer.tlb b/official/1.100/examples/windows/delphitools/peviewer/PeViewer.tlb new file mode 100644 index 0000000000000000000000000000000000000000..bd17d10457d6587bd3440c1af58d87d47bcb289e GIT binary patch literal 1672 zcmd^AO>5Lp6umQ!nnI;h5SdCBDULfUgA`iCh1fDop|vAcvk{rh%xg^@ladD1g^-QX zMZ0d7{sjL(K@h~f{U5q^p`MfEmNW>a;LZy-_nmXUUhaFDS$)`EuS!KIW3|M{1HhCK zsixG)^8!|j8Tyrp4ID$6LnRF(LuePomyDZ$wadFC zJBa5d*^~7<=SB8%{$t=LIjnor_|UJ5asKl73~$TAG+ad$C;HSZ)e+$2G4BIk4(7X4vf7Kgtmre z`?A;iTV@bBS59i2cHBYJCUi=sV)mcLFAD!R_{~^i#XVTA8+dArEpvz=oBH_uaE`p! H6xRC<_fvV# literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewerControl.pas b/official/1.100/examples/windows/delphitools/peviewer/PeViewerControl.pas new file mode 100644 index 0000000..3c252cf --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewerControl.pas @@ -0,0 +1,83 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeViewerControl.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit PeViewerControl; + +{$I JCL.INC} + +interface + +uses + ComObj, ActiveX, PeViewer_TLB, Forms, Windows, StdVcl; + +type + TPeViewerControl = class(TAutoObject, IPeViewerControl) + private + FROTHandle: Integer; + protected + procedure OpenFile(const FileName: WideString); safecall; + procedure BringToFront; safecall; + { Protected declarations } + public + destructor Destroy; override; + procedure Initialize; override; + end; + +implementation + +uses ComServ, PeViewerMain; + +procedure TPeViewerControl.OpenFile(const FileName: WideString); +begin + if Length(FileName) > 0 then MainForm.OpenFile(FileName, True); +end; + +procedure TPeViewerControl.BringToFront; +begin + Application.Restore; + SetForegroundWindow(Application.Handle); +end; + +procedure TPeViewerControl.Initialize; +begin + inherited; + OleCheck(RegisterActiveObject(Self as IUnknown, Class_PeViewerControl, + ACTIVEOBJECT_WEAK, FROTHandle)); + {$IFDEF COMPILER5_UP} + ComServer.UIInteractive := False; + {$ENDIF} +end; + +destructor TPeViewerControl.Destroy; +begin + OleCheck(RevokeActiveObject(FROTHandle, nil)); + inherited; +end; + +initialization + TAutoObjectFactory.Create(ComServer, TPeViewerControl, Class_PeViewerControl, + ciMultiInstance, tmApartment); + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.dfm b/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.dfm new file mode 100644 index 0000000..e5aa53f --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.dfm @@ -0,0 +1,2179 @@ +object MainForm: TMainForm + Left = 193 + Top = 108 + Width = 576 + Height = 403 + Caption = 'PE Viewer' + Color = clAppWorkSpace + Constraints.MinHeight = 150 + Constraints.MinWidth = 370 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIForm + Menu = MainMenu1 + OldCreateOrder = False + Position = poDefault + ShowHint = True + Visible = True + WindowMenu = Window1 + OnCreate = FormCreate + OnDestroy = FormDestroy + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object StatusBar1: TStatusBar + Left = 0 + Top = 330 + Width = 568 + Height = 19 + Panels = < + item + Width = 50 + end> + end + object CoolBar1: TCoolBar + Left = 0 + Top = 0 + Width = 568 + Height = 26 + AutoSize = True + Bands = < + item + Break = False + Control = ToolBar1 + ImageIndex = -1 + MinHeight = 22 + Width = 564 + end> + Color = clBtnFace + ParentColor = False + OnResize = CoolBar1Resize + object ToolBar1: TToolBar + Left = 9 + Top = 0 + Width = 551 + Height = 22 + AutoSize = True + Caption = 'ToolBar1' + Color = clBtnFace + EdgeBorders = [] + Flat = True + Images = ToolbarImagesList + ParentColor = False + TabOrder = 0 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = FileOpen1 + end + object ToolButton3: TToolButton + Left = 23 + Top = 0 + Action = Copy1 + end + object ToolButton4: TToolButton + Left = 46 + Top = 0 + Action = Save1 + end + object ToolButton20: TToolButton + Left = 69 + Top = 0 + Action = Find1 + end + object ToolButton5: TToolButton + Left = 92 + Top = 0 + Width = 8 + Caption = 'ToolButton5' + ImageIndex = 3 + Style = tbsSeparator + end + object ToolButton7: TToolButton + Left = 100 + Top = 0 + Action = GroupImports1 + Style = tbsCheck + end + object ToolButton19: TToolButton + Left = 123 + Top = 0 + Action = UnmangleNames1 + Style = tbsCheck + end + object ToolButton2: TToolButton + Left = 146 + Top = 0 + Action = OpenLibrary1 + end + object ToolButton18: TToolButton + Left = 169 + Top = 0 + Action = ShowUnitGen1 + end + object ToolButton11: TToolButton + Left = 192 + Top = 0 + Action = InvokeHelp1 + end + object ToolButton15: TToolButton + Left = 215 + Top = 0 + Width = 8 + Caption = 'ToolButton15' + ImageIndex = 10 + Style = tbsSeparator + end + object ToolButton14: TToolButton + Left = 223 + Top = 0 + Action = ViewResources1 + end + object ToolButton16: TToolButton + Left = 246 + Top = 0 + Action = ViewResDetails1 + Style = tbsCheck + end + object ToolButton17: TToolButton + Left = 269 + Top = 0 + Action = ViewResHex1 + Style = tbsCheck + end + object ToolButton8: TToolButton + Left = 292 + Top = 0 + Width = 8 + Caption = 'ToolButton8' + ImageIndex = 4 + Style = tbsSeparator + end + object ToolButton6: TToolButton + Left = 300 + Top = 0 + Action = Search1 + end + object ToolButton10: TToolButton + Left = 323 + Top = 0 + Width = 8 + Caption = 'ToolButton10' + ImageIndex = 14 + Style = tbsSeparator + end + object ToolButton9: TToolButton + Left = 331 + Top = 0 + Action = WindowCascade1 + end + object ToolButton12: TToolButton + Left = 354 + Top = 0 + Action = WindowTileHorizontal1 + end + object ToolButton13: TToolButton + Left = 377 + Top = 0 + Action = WindowTileVertical1 + end + end + end + object MainMenu1: TMainMenu + Images = ToolbarImagesList + Left = 8 + Top = 304 + object File1: TMenuItem + Caption = 'File' + object Open1: TMenuItem + Action = FileOpen1 + end + object Savetofile1: TMenuItem + Action = Save1 + end + object N3: TMenuItem + Caption = '-' + end + object Exit2: TMenuItem + Action = Exit1 + end + end + object Edit1: TMenuItem + Caption = 'Edit' + object Copytoclipboard1: TMenuItem + Action = Copy1 + end + object Selectall2: TMenuItem + Action = SelectAll1 + end + object N4: TMenuItem + Caption = '-' + end + object Findtext1: TMenuItem + Action = Find1 + end + end + object View1: TMenuItem + Caption = 'View' + object Search2: TMenuItem + Action = Search1 + end + object Openlibrary2: TMenuItem + Action = OpenLibrary1 + end + object Groupimports2: TMenuItem + Action = GroupImports1 + end + object Pascalunitgenerator1: TMenuItem + Action = ShowUnitGen1 + end + object N2: TMenuItem + Caption = '-' + end + object Unmanglenames2: TMenuItem + Action = UnmangleNames1 + end + object Viewresources2: TMenuItem + Action = ViewResources1 + end + object Viewdetails1: TMenuItem + Action = ViewResDetails1 + end + object Viewashex1: TMenuItem + Action = ViewResHex1 + end + end + object Window1: TMenuItem + Caption = 'Window' + object Cascade1: TMenuItem + Action = WindowCascade1 + end + object TileHorizontally1: TMenuItem + Action = WindowTileHorizontal1 + end + object TileVertically1: TMenuItem + Action = WindowTileVertical1 + end + end + object Help1: TMenuItem + Caption = 'Help' + object FindinWin32APIhelp1: TMenuItem + Action = InvokeHelp1 + end + object N1: TMenuItem + Caption = '-' + end + object Support1: TMenuItem + Action = SendMail1 + end + object About2: TMenuItem + Action = About1 + end + end + end + object ActionList: TActionList + Images = ToolbarImagesList + Left = 40 + Top = 304 + object Exit1: TAction + Caption = 'Exit' + Hint = 'Exit' + ImageIndex = 0 + OnExecute = Exit1Execute + end + object FileOpen1: TAction + Caption = 'Open...' + Hint = 'Open' + ImageIndex = 6 + ShortCut = 16463 + OnExecute = FileOpen1Execute + end + object InvokeHelp1: TAction + Caption = 'Find in Win32 API help' + Hint = 'Win32API help' + ImageIndex = 5 + ShortCut = 112 + OnExecute = InvokeHelp1Execute + OnUpdate = InvokeHelp1Update + end + object Copy1: TAction + Caption = 'Copy to clipboard' + Hint = 'Copy to clipboard' + ImageIndex = 2 + ShortCut = 16451 + OnExecute = Copy1Execute + OnUpdate = Copy1Update + end + object Save1: TAction + Caption = 'Save to file...' + Hint = 'Save to file' + ImageIndex = 2 + ShortCut = 16468 + OnExecute = Save1Execute + OnUpdate = Save1Update + end + object WindowCascade1: TWindowCascade + Category = 'Window' + Caption = 'Cascade' + Hint = 'Cascade' + ImageIndex = 7 + end + object WindowTileHorizontal1: TWindowTileHorizontal + Category = 'Window' + Caption = 'Tile Horizontally' + Hint = 'Tile Horizontally' + ImageIndex = 8 + end + object WindowTileVertical1: TWindowTileVertical + Category = 'Window' + Caption = 'Tile Vertically' + Hint = 'Tile Vertically' + ImageIndex = 9 + end + object About1: TAction + Caption = 'About...' + Hint = 'About' + OnExecute = About1Execute + end + object OpenLibrary1: TAction + Caption = 'Open library' + Hint = 'Open library' + ImageIndex = 4 + ShortCut = 16460 + OnExecute = OpenLibrary1Execute + OnUpdate = OpenLibrary1Update + end + object SelectAll1: TAction + Caption = 'Select all' + Hint = 'Select all' + ImageIndex = 14 + ShortCut = 16449 + OnExecute = SelectAll1Execute + OnUpdate = SelectAll1Update + end + object GroupImports1: TAction + Caption = 'Group imports' + Hint = 'Group imports' + ImageIndex = 13 + ShortCut = 16455 + OnExecute = GroupImports1Execute + OnUpdate = GroupImports1Update + end + object Search1: TAction + Caption = 'Search' + Hint = 'Search' + ImageIndex = 12 + OnExecute = Search1Execute + end + object ViewResources1: TAction + Caption = 'View resources' + Hint = 'View resources' + ImageIndex = 15 + ShortCut = 16466 + OnExecute = ViewResources1Execute + OnUpdate = ViewResources1Update + end + object ViewResDetails1: TAction + Caption = 'View details' + ImageIndex = 19 + ShortCut = 16452 + OnExecute = ViewResDetails1Execute + OnUpdate = ViewResDetails1Update + end + object ViewResHex1: TAction + Caption = 'View as hex' + Hint = 'View as hex' + ImageIndex = 20 + ShortCut = 16456 + OnExecute = ViewResHex1Execute + OnUpdate = ViewResHex1Update + end + object SendMail1: TAction + Caption = 'Support' + Hint = 'Support' + ImageIndex = 21 + OnExecute = SendMail1Execute + end + object ShowUnitGen1: TAction + Caption = 'Pascal unit generator' + Hint = 'Pascal unit generator' + ImageIndex = 22 + OnExecute = ShowUnitGen1Execute + OnUpdate = ShowUnitGen1Update + end + object UnmangleNames1: TAction + Caption = 'Unmangle names' + Hint = 'Unmangle names' + ImageIndex = 23 + ShortCut = 16469 + OnExecute = UnmangleNames1Execute + OnUpdate = UnmangleNames1Update + end + object Find1: TAction + Caption = 'Find text' + Hint = 'Find text' + ImageIndex = 24 + ShortCut = 16454 + OnExecute = Find1Execute + OnUpdate = Find1Update + end + end + object OpenFileDialog: TOpenDialog + Filter = + 'PE Exe files (*.exe;*.dll;*.bpl)|*.exe;*.dll;*.bpl|All files (*.' + + '*)|*.*' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 104 + Top = 304 + end + object ToolbarImagesList: TImageList + ShareImages = True + Left = 72 + Top = 304 + Bitmap = { + 494C010119001D00040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000008000000001002000000000000080 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFF0000FFFF0000FFFF000000000000000000000000 + 00007F7F7F007F7F7F007F7F7F00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 0000000000BFFFFFFF000000000000000000FFFF0000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF00000000007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F0000000000FFFFFF00000000000000000000FFFF0000FFFF0000FF + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000000000000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF0000000000000000000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF0000000000FFFF0000FFFF0000FFFF + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F00FFFFFF007F7F7F00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00000000BFBFBFBF00FFFFFF000000 + 0000FFFFFF0000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F007F7F7F00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF0000FFFF000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFF000000FF0000BFFF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FFFF0000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000000000000000000000000 + 0000000000BFFFFFFF000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000000000FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF000000000000000000FFFFFF0000000000000000BFFFFF + FF000000000000000000FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF0000FFFF0000FFFF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000808080008080800080808000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00FFFFFF00BFBF + BF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBF + BF00FFFFFF000000FF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000000000000000000000000 + 0000FFFFFF0000FFFF000000000000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000BFFFFF + FF0000FFFF000000000000FFFFBFFFFFFF00000000BFFFFFFF0000FFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000000000FFFFFF0000FFFF00000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000000000000000000000000000000000000000000000FFFFBFFFFF + FF0000FFFFBFFFFFFF00000000BFFFFFFF0000FFFF0000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000FFFFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00000000000000FFFFBFFFFF + FF0000FFFFBFFFFFFF0000FFFF00000000000000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFF00000000000000000080000000800000008000 + 00008000000080000000FFFFFF00800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF000000 + 000000000000000000000000000000000000FFFF00BFFFFF00000000000000FF + FF00FFFFFF0000FFFF000000000000FFFF00FFFFFF0000FFFF00000000BFFFFF + FF00000000BFFFFFFF0000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00FFFFFF0000000000FFFFFF00000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00000000 + 000000FFFFBFFFFFFF0000FFFFBFFFFFFF000000000000000000FFFFFFBFFFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000800000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF0000808000000000000000008000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF0000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF0000808000000000000000000000000000BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000008000000000000000BFBFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBFBFBFBFBF0000000080000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000003F7F7F + 7F007F7F7F000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000080000000000000000000000000BFBFBF000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000800000 + 0000000000BFBFBFBF00BFBFBF000000000000000000FF000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F3F7F7F + 7F00000000000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000BFFFFF + FF00FFFFFF000000000000000000000000000000008000000000000000000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF000000 + 0000FFFFFF0000000000BFBFBF0000000000FF00000000000000FF0000BFFF00 + 0000000000000000000000000000000000000000003F7F7F7F007F7F7F000000 + 0000000000000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00FFFFFF0000000000FFFFFFBFFFFFFF00FFFFFF0000000000FFFFFFBFFFFF + FF00FFFFFF000000000000000000000000000000008000000000000000000000 + 00007F7F7FBFBFBFBF0000000000000000000000000000000000000000000000 + 00007F7F7F00000000000000008000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF000000000000000000BFBFBF0000000000FF00000000000000000000000000 + 0000FF0000000000000000000000000000007F7F7F3F7F7F7F00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFF0000000000FFFFFFBFFFFFFF00FFFFFF0000000000FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000000000000007F7F7FBFBFBF + BF00BFBFBFBFBFBFBF00000000000000000000000000000000007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000FFFFFF000000 + 0000000000BFFFFFFF000000000000000000FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000BFBFBF0000000000FF0000BFFF000000000000000000 + 00000000000000000000000000BFFFFFFF007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F3F7F7F7F007F7F7F00000000000000000000000000FFFFFFBFFFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000000000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000BFBFBF000000000000000000FF000000FF0000BFFF00 + 0000FF0000BFFF00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00000000BFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000000000000000000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000000000FF00BFBFBF000000 + FF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000000000000000FF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 000000000000000000000000FF0000000000000000000000000000000000FF00 + 0000000000BFFF0000000000000000000000000000BFFFFFFF00000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000000000000000FF00000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF0000000000000000000000FF00000000000000000000000000FF0000000000 + 000000000000FF0000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 000000000000000000000000000000000000000000000000FF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F00000000800000000000000080000000000000000000000000000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00000000BFFFFFFF0000000000000000000000000000000000FF0000000000 + 000000000000FF0000000000000000000000000000BFFFFFFF00000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBF0000000000000000000000 + 0000000000800000000000000080000000000000000000000000000000BFFFFF + FF000000000000000000000000BFFFFFFF000000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF0000000080000000000000000000000000FF0000000000 + 000000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000BFFFFF + FF0000000000000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF000000003F7F7F7F00000000800000 + 0000000000800000000000000080000000000000000000000000000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF0000000000000000000000008000000000000000000000000000000000FF00 + 0000FF0000BFFF0000000000000000000000000000BFFFFFFF00000000BFFFFF + FF00000000BFFFFFFF00FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F000000008000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000BFFFFF + FF00FFFFFFBFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000800000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00000000BFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000000000 + 00000000003F7F7F7F0000000080000000000000008000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF0000000000000000000000000000000000000000 + 00000000003F7F7F7F0000000000000000000000003F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF0000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000000000FFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF3F7F7F + 7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF3F7F7F + 7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 00000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000003F7F7F7F000000FF000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF0000FFFF3F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000000000FF0000000000BFFF000000FF0000BFFF00 + 0000FF0000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000003F7F7F7F000000FF000000 + FF000000FF000000000000FF000000FF000000FF000000000000FF0000BFFF00 + 0000FF00003F7F7F7F0000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + FF000000000000FF000000FF000000FF000000FF000000FF0000000000BFFF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 000000FF000000FF000000FF000000FF000000FF000000FF000000FF00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 00000000000000FF000000FF000000FF000000FF000000FF0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000FFFF000000000000FFFF000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000FFFF0000000000000000000000000000000000000000 + 00000000003F7F7F7F0000000000000000000000003F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFF0000FFFF0000FFFF000000000000000000000000 + 00007F7F7F007F7F7F007F7F7F00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 0000000000BFFFFFFF000000000000000000FFFF0000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF00000000007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F0000000000FFFFFF00000000000000000000FFFF0000FFFF0000FF + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000000000000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF0000000000000000000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF0000000000FFFF0000FFFF0000FFFF + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F00FFFFFF007F7F7F00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00000000BFBFBFBF00FFFFFF000000 + 0000FFFFFF0000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F007F7F7F00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF0000FFFF000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFF000000FF0000BFFF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FFFF0000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF0000FFFF0000FFFF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000808080008080800080808000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00FFFFFF00BFBF + BF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBF + BF00FFFFFF000000FF00FFFFFF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000000000000000000000FFFFFF0000000000FFFF + FF00000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000800000008000 + 00008000000080000000FFFFFF00800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00FFFFFF0000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF007F7F7F000000FF007F7F7F00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 000000000000FF000000FF000000FF000000FF000000FF000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF000000FF000000FF000000FF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FF000000FF000000FF000000FF00 + 0000FF000000FF000000BFBFBF0000000000BFBFBF00FF000000FF000000FF00 + 0000FF000000FF000000FF00000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF007F7F7F000000FF007F7F7F00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF00000000007F7F7F0000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000000FFFF00000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000000000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000080000000800000008000000000000000FFFFFF00000000007F7F + 7F007F7F7F0000000000FFFFFF007F7F7F00FFFFFF00000000007F7F7F007F7F + 7F0000000000FFFFFF00000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF0000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF00000000000000000000000000FFFFFF0000FFFF000000 + 0000008080000080800000808000008080000080800000808000008080000080 + 8000008080000000000000000000000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 00008000000080000000FFFFFF00800000007F7F7F0000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000007F7F7F0000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF000000FF007F7F7F0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000FFFF00FFFFFF0000FF + FF00000000000080800000808000008080000080800000808000008080000080 + 8000008080000080800000000000000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000007F7F7F0000000000FFFFFF000000 + 00000000000000000000FFFFFF007F7F7F00FFFFFF0000000000000000000000 + 0000FFFFFF00000000007F7F7F000000000000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00800000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 000080000000000000000000000000000000000000007F7F7F0000000000FFFF + FF000000000000000000FFFFFF007F7F7F00FFFFFF000000000000000000FFFF + FF00000000007F7F7F00000000000000000000FFFF00FFFFFF0000FFFF00FFFF + FF007F7F7F007F7F7F0000FFFF00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF008000 + 000080000000800000008000000080000000800000008000000080000000FFFF + FF0080000000000000000000000000000000000000007F7F7F0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000007F7F7F000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF000000FF000000FF00FFFFFF0000FFFF007F7F7F000000FF000000FF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 000080000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF000000FF000000FF007F7F7F00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF000000FF000000FF000000FF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF000000FF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 00008000000080000000800000008000000080000000FFFFFF00800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F0000000000000000007F7F7F00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00BFBFBF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F007F7F7F0000FFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F0000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000BFBFBF0000000000FF000000FF000000FF00 + 00000000FF00FF000000FF0000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000000000000000FFFFFF0000000000000000000000 + 00000000FF0000000000000000007F7F7F000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF00000000000000000000000000FF000000FF000000FF00 + 0000FF000000FF00000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000FF000000FF00 + 0000FF0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF000000000000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF00000000000000000000000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF00000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF000000000000000000000000000000FF000000FF000000 + FF00000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F00FFFF000000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF00000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF000000000000000000000000000000FF000000FF000000 + FF0000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F00FFFF0000FFFF00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF00000000000000000000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000800000000100010000000000000400000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000F000000000000000F000000000000000 + F000000000000000F000000000000000F000000000000000F000000000000000 + F000000000000000E000000000000000C0000000000000008000000000000000 + 8000000000000000000000000000000000000000000000000001000000000000 + 000300000000000000070000000000008003C3808007FFFF8003C3000003FFE7 + 8003C2010001FFC78003C00380108F8F8003C003000007008003C00300003200 + 80030003800000008003000380008000800300030000F900800300030000E100 + 800300030000C900800300070000C9008003000FC001C3008007003FC001E300 + 800F80FFC007FF01801FC3FFE3FFFF03FFFFFFFFFFFFBFFF00010001F83FBFFF + 000100011010B04900010001E00F807F1FF11FF1C007B07F1DF11FF18003B9FF + 1CF118318003BFFF1C7118318003B0491C3118318003807F1C7118318003B07F + 1CF11831C007B9FF1DF11FF1E00FBFFF1FF11FF13018048F00010001F83F07FF + 00010001FFFF07FF00010001FFFF9FFFFFFF8000FFE3FC01FFF88000FC418C01 + 20F8C00088000401007FE00000000401007CF00000000401003CF80000008C01 + 000FFC000000FC01000406000000FC01000C07000000040301FF018000000407 + E3FC01800000040FFFFC0060000007FFFFFFC06000010603FFF8C0600001FF07 + FFF8F044000DFF8FFFFFF07ED553FFDFFFFFFFFFFFFF800180038003C0070000 + 80038003BFEB00008003800300050000800380037E310000800380037E350000 + 8003800300060000800380037FEA0000800380038014E00780038003C00AE007 + 80038003E001E00780038003E007E00780038003F007E00F80038003F003E01F + FFFFFFFFF803E03FFFFFFFFFFFFFE07FFFFFFFFFFFFFFC00FFFFF83FFFFFFC00 + F83FE00F001FFC000001C007000FFC00000180030007E000000180030003E000 + 000100010001E000000100010000E00780030001001F800780030001001F8007 + 80030001001F8007C10780038FF1801FE38F8003FFF9801FFFFFC007FF75801F + FFFFE00FFF8F801FFFFFF83FFFFFFFFFC007FF00FC00FE7FC007FF00FC00FE1F + C007FF00FC00FC07C007FF00FC00FC01C00700000000F800C00700000000F800 + C007000000000000C007000000000000C007002300230001C007000100010032 + C00700000000003EC00700230023003EC00700630063003EC00700C300C3001D + C007010701070023C00703FF03FF003F00000000000000000000000000000000 + 000000000000} + end + object SaveDialog: TSaveDialog + DefaultExt = 'txt' + Filter = 'Text files (*.txt)|*.txt|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing] + Left = 136 + Top = 304 + end + object IconImageList: TImageList + ShareImages = True + Left = 168 + Top = 304 + Bitmap = { + 494C010111001300040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000005000000001002000000000000050 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF00000000000000003F7F7F7F000000003F7F7F7F00000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF000000FF000000FF3F7F7F7F000000003F7F7F7F000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF00000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF00000000000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000080000000000000008000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000800000000000000080000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000000000000000000000000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF000000FF000000FF000000000000000000000000000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF00000000000000003F7F7F7F000000003F7F7F7F00000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + 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 + 0000000000000000000000000000000000000000008000000000000000800000 + 00000000000000000000FFFFFFBFFFFFFF000000008000000000000000000000 + FF00000080000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000003F7F7F7F00000000000000 + 0000000000BFFFFFFF00FFFFFF00000000000000008000000000000000000000 + FF00000080000000FF0000000000008080000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008080808000C0C0C080C0C0 + C000C0C0C080C0C0C000C0C0C080C0C0C000C0C0C080C0C0C000C0C0C080C0C0 + C000C0C0C0000000000000000000000000007F7F7F0000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0000000080000000000000008000000000000000000000 + FF00000080000000FF0000808000008080000000008080808000808080808080 + 8000808080808080800080808080808080008080808080808000808080808080 + 8000808080808080800080808000000000000000000000000000808080808080 + 8000808080808080800080808080808080008080808080808000808080808080 + 8000808080808080800000000000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00C0C0C000000000000000000000000000000000BFFFFFFF00000000000000 + 0000FFFFFFBFFFFFFF0000000080000000000000008000000000000000000000 + FF00000080000000FF0000808000008080000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00C0C0C00000FFFF0080808000000000000000000000000000808080BFFFFF + FF0000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C00000FFFF808080800000000000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000000000000000000000800000 + 0000000000BFFFFFFF0000000080000000000000008000000000000000000000 + FF00000080000000FF0000808080000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C00000FFFF80C0C0C00080808000000000000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00C0C0C0000000000080808000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000003F7F7F7F00000000800000 + 0000000000BFFFFFFF00000000800000000000000080000000000000FF000000 + FF000000FF000000FF000000FF80000000000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00C0C0C00000FFFF0080808000000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C000808080000000000080808000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0000000080C0C0C000C0C0C00000000000FFFFFFBFFFFF + FF00C0C0C00000000000000000000000000000000080000000007F7F7F000000 + 0000FFFFFF00000000007F7F7F80000000000000000000000000000080000000 + 8000000080000000800000008080000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C00000FFFF80C0C0C0008080800000000000808080BFFFFFFF00C0C0C00000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00000000808080800080808000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFF8080808000FFFFFF00000000008080808080808000000000BFFFFF + FF00C0C0C0000000000000000000000000000000008000000000000000000000 + 00000000003F7F7F7F0000000080000000000000000000808000008080000080 + 8000000000800000000000000080000000000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00C0C0C00000FFFF008080800000000000808080BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF808080 + 800000000080C0C0C00080808000000000000000008080808000FFFFFFBFFFFF + FF0000000080C0C0C000000000BFFFFFFF008080800000000000FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000000000000000080800000808000008080800000 + 0000000000800000000000000080000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C00000FFFF80C0C0C00080808000000000008080808080808000808080808080 + 8000808080808080800080808080808080008080808080808000808080808080 + 80008080800000FFFF0080808000000000000000008080808000FFFFFF000000 + 000000FFFF00000000008080808080808000000000BFFFFFFF00FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000008000000000000000000000 + 0000000000800000000000000000008080000080800000808000000000800000 + 0000000000800000000000000080000000000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C00000FF + FF00C0C0C00000FFFF0080808000000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0C00000FFFF80C0C0 + C00000FFFF80C0C0C00080808000000000000000008080808000FFFFFFBFFFFF + FF000000000000FFFF000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000808000008080000080808000000000000000800000 + 0000000000800000000000000080000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0080808000000000000000008080808000FFFFFF0000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C0BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0080808000000000000000008080808000FFFFFFBFFFFF + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00C0C0C0000000000000000000000000000000008000000000000000000000 + 0000000000000080800000808000008080000000008000000000000000800000 + 0000000000800000000000000080000000000000008080808000C0C0C00000FF + FF00C0C0C00000FFFF00C0C0C00000FFFF00C0C0C08080808000808080808080 + 8000808080808080800080808000000000000000008080808000FFFFFF80C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C000FFFFFF8080808000808080808080 + 8000808080808080800080808000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000008080800000000000000080000000000000003F7F7F + 7F000000003F7F7F7F000000008000000000000000000000000080808080C0C0 + C00000FFFF80C0C0C00000FFFF80C0C0C0008080800000000000000000000000 + 0000000000000000000000000000000000000000000000000000808080BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF008080800000000000000000000000 + 0000000000000000000000000000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00C0C0C0BFFFFF + FF00808080000000000000000000000000000000008000000000000000000000 + 00000000000000000000000000800000000000000080000000000000003F7F7F + 7F000000003F7F7F7F0000000080000000000000000000000000000000808080 + 8000808080808080800080808080808080000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000808080 + 8000808080808080800080808080808080000000000000000000000000000000 + 0000000000000000000000000000000000000000008080808000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00C0C0C0808080 + 8000000000000000000000000000000000000000008000000000008080000000 + 000000000000000000000000003F7F7F7F0000000080000000000000003F7F7F + 7F000000003F7F7F7F0000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008080808000808080808080 + 8000808080808080800080808080808080008080808080808000808080000000 + 0000000000000000000000000000000000000000008000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF007F0000007F0000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 00000000000000000000000000BFFFFFFF007F7F7F007F0000007F0000007F00 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + FF000000FF000000FF00000000BFFFFFFF00000000007F0000007F0000007F00 + 00007F0000007F0000007F7F7F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000BFBF + BF00BFBFBF007F7F7F000000000000000000000000007F7F7F007F7F7F007F7F + 7F00000000000000000000000000000000000000000000000000000000BFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + FF000000FF000000FF00000000BFFFFFFF0000000000000000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF0000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000007F7F + 7F007F7F7F000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + FF000000FF000000FF00000000BFFFFFFF0000000000000000007F7F7F007F00 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 00000000000000000000000000BFFFFFFF000000000000000000000000007F00 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000BFBFBF007F7F7F00FFFF + FF00000000000000000000FFFF00007F7F00007F7F000000000000000000FFFF + FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF000000000000000000000000000000 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 + 00007F0000007F0000007F7F7F00000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF000000FF000000 + FF000000000000000000000000000000000000000000BFBFBF000000000000FF + FF000000000000FFFF00007F7F0000FFFF00007F7F00007F7F000000000000FF + FF00000000007F7F7F0000000000000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFFBFFFFFFF000000FF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF00000000000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF00000000000000000000000000FFFFFF0000000000FFFF + FF000000000000FFFF0000FFFF0000FFFF0000FFFF00007F7F0000000000FFFF + FF00000000007F7F7F0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFFBFFFFFFF00FFFFFF000000 + 00000000000000000000FFFFFFBFFFFFFF000000000000000000000000000000 + 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00 + 0000FF000000FF00000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF000000FF000000 + FF000000000000000000000000000000000000000000FFFFFF000000000000FF + FF0000000000FFFFFF0000FFFF0000FFFF00007F7F0000FFFF000000000000FF + FF0000000000BFBFBF0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00000000000000 + 00000000000000000000000000BFFFFFFF00000000000000000000000000FF00 + 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF007F7F7F00FFFF + FF000000000000000000FFFFFF00FFFFFF0000FFFF000000000000000000FFFF + FF007F7F7F00BFBFBF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FF00 + 0000FF000000FF000000FF000000FF000000FF000000FF000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF000000000000000000000000000000000000000000FFFF00BFFFFF + 0000FFFF00000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF000000000000000000FF000000FF00 + 0000FF000000FF000000FF000000FF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00BFBF + BF0000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000BFBF + BF00BFBFBF000000000000000000000000000000000000000000FFFF00BFFFFF + 0000FFFF00000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF0000000000FF000000FF000000FF00 + 0000FF000000FF00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00BFBFBF007F7F7F000000000000000000000000007F7F7F00BFBFBF00BFBF + BF00000000000000000000000000000000000000000000000000FFFF00BFFFFF + 0000FFFF00000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF0000000000FF000000FF000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00BFBFBF00BFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFFBFFFFFFF00FF000000FF000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FF000000FF000000FF000000FF000000FF000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FF000000FF000000FF000000FF00 + 0000FF000000FF000000BFBFBF0000000000BFBFBF00FF000000FF000000FF00 + 0000FF000000FF000000FF000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF00000000007F7F7F0000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000080808000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000007F7F + 7F007F7F7F0000000000FFFFFF007F7F7F00FFFFFF00000000007F7F7F007F7F + 7F0000000000FFFFFF0000000000000000000000000000000000000000000000 + 000000000000000000008080800080808000FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000808080008080800000000000000000000000000000000000FFFFFF00FFFF + FF0000000000000000000000000000000000000000000000000000000000FFFF + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF + FF00000000000000000000000000000000007F7F7F0000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000007F7F7F00000000000000000000000000000000000000 + 00000000000000000000808080000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008080800000000000000000000000000000000000FFFFFF000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000007F7F7F0000000000FFFFFF000000 + 00000000000000000000FFFFFF007F7F7F00FFFFFF0000000000000000000000 + 0000FFFFFF00000000007F7F7F00000000000000000000000000000000000000 + 00000000000080808000808080000000000000000000FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000080808000808080000000000000000000FFFFFF00FFFFFF000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000008080800000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000808080000000000000000000FFFFFF00000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 00000000000000FFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F0000000000FFFF + FF000000000000000000FFFFFF007F7F7F00FFFFFF000000000000000000FFFF + FF00000000007F7F7F0000000000000000000000000000000000000000000000 + 0000808080008080800000000000000000000000000000000000FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000008080800080808000FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00FFFFFF0000FFFF0000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000007F7F7F0000000000000000000000000000000000000000000000 + 0000808080008080800080808000808080008080800080808000808080008080 + 8000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000080808000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 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 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F000000000000000000000000000000000000000000007F + 7F00007F7F00007F7F00007F7F00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F0000000000BFBFBF00BFBFBF00BFBFBF00BFBFBF0000000000007F + 7F0000FFFF00007F7F0000FFFF00000000000000000000000000000000000000 + 000000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF0000000000000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F00000000000000000000000000000000000000000000FF + FF00007F7F0000FFFF00007F7F0000000000000000000000000000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF00000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF00007F7F0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000FFFFFF000000 + 00000000000000000000FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF0000FFFF00007F7F000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF000000FF0000000000000000000000000000FFFF000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + FF00000000000000000000000000FFFFFF0000000000BFBFBF00000000000000 + 0000FFFFFF0000000000FFFFFF000000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF000000FF000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + FF000000FF000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000FF000000FF000000FF000000FF000000FF000000 + FF000000FF00000000000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF000000FF000000 + FF000000FF000000FF0000000000FFFFFF000000000000000000FFFFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000FF000000 + FF0000000000000000000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000000000FF000000FF000000 + FF000000FF000000FF000000FF0000000000FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000FF000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000000000000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF0000000000BFBFBF00FFFFFF000000 + 0000FFFFFF0000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000000000FF000000FF000000 + FF000000FF000000FF000000FF0000000000FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000007F + 7F0000FFFF0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FF000000FF000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00007F7F0000FFFF0000FFFF000000000000000000FFFFFF0000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000007F + 7F0000FFFF00007F7F0000FFFF000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000500000000100010000000000800200000000000000000000 + 000000000000000000000000FFFFFF00FFFF000000000000FFFF000000000000 + C631000000000000E223000000000000F007000000000000F88F000000000000 + FC1F000000000000FE3F000000000000FC1F000000000000F80F000000000000 + F007000000000000E223000000000000C631000000000000FFFF000000000000 + FFFF000000000000FFFF000000000000F862FFFFFFFF800380E0C000E0008003 + 01E08000C000800301E08000C000800331E180008000800331C1800080008003 + C181800000008003C307800000008003FE17800000009003CC37800080008203 + A877800080008C0340F780018001800301E3C07FC07F8007C1E3E0FFE0FF800F + C0E3FFFFFFFF801FC83FFFFFFFFFFFFFFFFFFFFFFFFF80001FFFFFFFF83F8000 + 07FFFFFFE00FC00081FFFFFFC007E000C07FFCFF8003F000C01FFC3F8003F800 + E007FC0F0001FC00F00100030001FE00000000000001FF00F00300030001FF80 + E00FFC0F00018380E03FFC3F800383E0C0FFFCFF800383E083FFFFFFC00783E0 + 8FFFFFFFE00F83843FFFFFFFF83FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 1FFFF83FFFFFFFFF041F0001FFFFFFFF000F0001FE7FF00F000F0001FC3FF3CF + 00070001FDBFFBDF00010001F99FF99F00008003FBDFFDBF00018003F3CFFC3F + 003F8003F00FFE7FFC7FC107FFFFFFFFFFFFE38FFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FC0FC00FFFFFFDF8000F000FC00FFCF + 8000C000FC00FFC700000000FC00000380000000FC00000180000000EC000000 + 80000000E40000018A800000E00000038A800000000000078A8000000001000F + 800000010003001F8A8000030007007F8FC00007000F00FFFFC0001FE3FF01FF + FFC0007FE7FF03FFFFC001FFEFFFFFFF00000000000000000000000000000000 + 000000000000} + end +end diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.pas b/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.pas new file mode 100644 index 0000000..1364918 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewerMain.pas @@ -0,0 +1,631 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is PeViewerMain.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit PeViewerMain; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + Menus, ActnList, ToolWin, ComCtrls, StdActns, ImgList, ShellAPI, JclPeImage; + +const + UM_CHECKPARAMSTR = WM_USER + $100; + +type + TMainForm = class(TForm) + MainMenu1: TMainMenu; + ActionList: TActionList; + File1: TMenuItem; + StatusBar1: TStatusBar; + FileOpen1: TAction; + Edit1: TMenuItem; + Window1: TMenuItem; + Exit1: TAction; + Exit2: TMenuItem; + InvokeHelp1: TAction; + Copy1: TAction; + Save1: TAction; + Copytoclipboard1: TMenuItem; + OpenFileDialog: TOpenDialog; + WindowCascade1: TWindowCascade; + WindowTileHorizontal1: TWindowTileHorizontal; + WindowTileVertical1: TWindowTileVertical; + Cascade1: TMenuItem; + TileHorizontally1: TMenuItem; + TileVertically1: TMenuItem; + ToolbarImagesList: TImageList; + Savetofile1: TMenuItem; + Open1: TMenuItem; + Help1: TMenuItem; + About1: TAction; + About2: TMenuItem; + CoolBar1: TCoolBar; + ToolBar1: TToolBar; + ToolButton1: TToolButton; + ToolButton3: TToolButton; + ToolButton4: TToolButton; + ToolButton5: TToolButton; + ToolButton11: TToolButton; + N3: TMenuItem; + SaveDialog: TSaveDialog; + OpenLibrary1: TAction; + ToolButton2: TToolButton; + SelectAll1: TAction; + Selectall2: TMenuItem; + IconImageList: TImageList; + GroupImports1: TAction; + View1: TMenuItem; + Openlibrary2: TMenuItem; + FindinWin32APIhelp1: TMenuItem; + N1: TMenuItem; + Search1: TAction; + ToolButton6: TToolButton; + N2: TMenuItem; + Search2: TMenuItem; + ToolButton7: TToolButton; + ToolButton8: TToolButton; + Groupimports2: TMenuItem; + ToolButton9: TToolButton; + ToolButton10: TToolButton; + ToolButton12: TToolButton; + ToolButton13: TToolButton; + ViewResources1: TAction; + Viewresources2: TMenuItem; + ToolButton14: TToolButton; + ToolButton15: TToolButton; + ViewResDetails1: TAction; + ViewResHex1: TAction; + ToolButton16: TToolButton; + ToolButton17: TToolButton; + Viewdetails1: TMenuItem; + Viewashex1: TMenuItem; + SendMail1: TAction; + Support1: TMenuItem; + ShowUnitGen1: TAction; + ToolButton18: TToolButton; + Pascalunitgenerator1: TMenuItem; + UnmangleNames1: TAction; + ToolButton19: TToolButton; + Unmanglenames2: TMenuItem; + Find1: TAction; + ToolButton20: TToolButton; + N4: TMenuItem; + Findtext1: TMenuItem; + procedure Exit1Execute(Sender: TObject); + procedure InvokeHelp1Update(Sender: TObject); + procedure FileOpen1Execute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure InvokeHelp1Execute(Sender: TObject); + procedure Save1Execute(Sender: TObject); + procedure OpenLibrary1Execute(Sender: TObject); + procedure Copy1Update(Sender: TObject); + procedure OpenLibrary1Update(Sender: TObject); + procedure Copy1Execute(Sender: TObject); + procedure SelectAll1Execute(Sender: TObject); + procedure GroupImports1Update(Sender: TObject); + procedure GroupImports1Execute(Sender: TObject); + procedure Search1Execute(Sender: TObject); + procedure ViewResources1Update(Sender: TObject); + procedure ViewResources1Execute(Sender: TObject); + procedure ViewResDetails1Update(Sender: TObject); + procedure ViewResDetails1Execute(Sender: TObject); + procedure ViewResHex1Update(Sender: TObject); + procedure ViewResHex1Execute(Sender: TObject); + procedure Save1Update(Sender: TObject); + procedure About1Execute(Sender: TObject); + procedure SendMail1Execute(Sender: TObject); + procedure ShowUnitGen1Update(Sender: TObject); + procedure ShowUnitGen1Execute(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure UnmangleNames1Update(Sender: TObject); + procedure UnmangleNames1Execute(Sender: TObject); + procedure SelectAll1Update(Sender: TObject); + procedure Find1Update(Sender: TObject); + procedure Find1Execute(Sender: TObject); + procedure CoolBar1Resize(Sender: TObject); + private + FWin32Help: string; + function ActiveListViewToStrings: TStrings; + function IsWin32Help: Boolean; + function IsPeDumpChildActive: Boolean; + function IsPeResChildActive: Boolean; + function IsSearchChildActive: Boolean; + function IsGenDefChildActive: Boolean; + procedure OnActiveFormChange(Sender: TObject); + procedure UMCheckParamStr(var Message: TMessage); message UM_CHECKPARAMSTR; + procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES; + public + function FindPeResourceView(APeImage: TJclPeImage): TForm; + procedure InvokeWin32Help(const Name: string); + procedure OpenFile(const FileName: TFileName; CheckIfOpen: Boolean); + end; + +var + MainForm: TMainForm; + +const + icoHeader = 0; + icoDirectory = 1; + icoImports = 2; + icoExports = 3; + icoResources = 4; + icoSection = 5; + icoSortAsc = 6; + icoSortDesc = 7; + icoDelayImport = 8; + icoBoundImport = 9; + icoLoadConfig = 10; + icoRelocation = 11; + icoDebug = 12; + icoFolderShut = 13; + icoFolderOpen = 14; + icoResItem = 15; + icoWarning = 16; + +implementation + +uses ActiveX, ClipBrd, ToolsUtils, JclFileUtils, JclSysUtils, + About, PeDump, PeSearch, PeResView, PeGenDef, FindDlg; + +{$R *.DFM} + +{ TMainForm } + +procedure TMainForm.Exit1Execute(Sender: TObject); +begin + Close; +end; + +function TMainForm.IsPeDumpChildActive: Boolean; +begin + Result := ActiveMDIChild is TPeDumpChild; +end; + +procedure TMainForm.InvokeHelp1Update(Sender: TObject); +begin + TAction(Sender).Enabled := IsWin32Help and IsPeDumpChildActive and + (TPeDumpChild(ActiveMDIChild).ActiveWin32Function <> ''); +end; + +procedure TMainForm.FileOpen1Execute(Sender: TObject); +var + I: Integer; +begin + with OpenFileDialog do + begin + FileName := ''; + if Execute then + for I := 0 to Files.Count - 1 do OpenFile(Files[I], False); + end; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FWin32Help := Win32HelpFileName; + Screen.OnActiveFormChange := OnActiveFormChange; + DragAcceptFiles(Handle, True); +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + Screen.OnActiveFormChange := nil; + WinHelp(Application.Handle, PChar(FWin32Help), HELP_QUIT, 0); + DragAcceptFiles(Handle, False); +end; + +procedure TMainForm.OnActiveFormChange(Sender: TObject); +begin + if IsPeDumpChildActive then + begin +// GroupImports1.Checked := TPeDumpChild(ActiveMDIChild).GroupImports; + StatusBar1.Panels[0].Text := TPeDumpChild(ActiveMDIChild).FileName; + end else + if IsPeResChildActive then + begin + StatusBar1.Panels[0].Text := TPeResViewChild(ActiveMDIChild).PeImage.FileName; + end else + if IsGenDefChildActive then + begin + StatusBar1.Panels[0].Text := TPeGenDefChild(ActiveMDIChild).FileName; + end else + StatusBar1.Panels[0].Text := ''; +end; + +procedure TMainForm.OpenFile(const FileName: TFileName; CheckIfOpen: Boolean); +var + EI: TJclPeImage; + I: Integer; +begin + if CheckIfOpen then + begin + for I := 0 to MDIChildCount - 1 do + if MDIChildren[I] is TPeDumpChild and (TPeDumpChild(MDIChildren[I]).FileName = FileName) then + begin + MDIChildren[I].BringToFront; + Exit; + end; + end; + Screen.Cursor := crHourGlass; + EI := TJclPeImage.Create; + try + try + EI.FileName := FileName; + TPeDumpChild.CreateEx(Self, EI); + except + EI.Free; + raise; + end; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TMainForm.InvokeHelp1Execute(Sender: TObject); +begin + InvokeWin32Help(TPeDumpChild(ActiveMDIChild).ActiveWin32Function); +end; + +procedure TMainForm.Save1Execute(Sender: TObject); +var + SL: TStrings; +begin + if IsPeResChildActive and TPeResViewChild(ActiveMDIChild).CanSaveResource then + TPeResViewChild(ActiveMDIChild).SaveResource + else + if IsGenDefChildActive then + TPeGenDefChild(ActiveMDIChild).SaveUnit + else + with SaveDialog do + begin + if IsPeDumpChildActive then + FileName := ChangeFileExt(TPeDumpChild(ActiveMDIChild).FileName, '.txt') + else + FileName := ''; + if Execute then + begin + SL := ActiveListViewToStrings; + try + SL.SaveToFile(FileName); + finally + SL.Free; + end; + end; + end; +end; + +function TMainForm.IsWin32Help: Boolean; +begin + Result := FWin32Help <> ''; +end; + +procedure TMainForm.InvokeWin32Help(const Name: string); +var + S: string; +begin + S := PeStripFunctionAW(Name); + WinHelp(Application.Handle, PChar(FWin32Help), HELP_KEY, DWORD(S)); +end; + +procedure TMainForm.OpenLibrary1Execute(Sender: TObject); +begin + if IsPeDumpChildActive then + OpenFile(TPeDumpChild(ActiveMDIChild).ActiveLibName, False) + else + OpenFile(TPeSearchChild(ActiveMDIChild).ActiveLibName, False); +end; + +procedure TMainForm.Copy1Update(Sender: TObject); +begin + TAction(Sender).Enabled := (Screen.ActiveControl is TListView) or + ((Screen.ActiveControl is TRichEdit) and ((Screen.ActiveControl as TRichEdit).SelLength > 0)); +end; + +procedure TMainForm.OpenLibrary1Update(Sender: TObject); +begin + OpenLibrary1.Enabled := + (IsPeDumpChildActive and (TPeDumpChild(ActiveMDIChild).ActiveLibName <> '')) or + (IsSearchChildActive and (TPeSearchChild(ActiveMDIChild).ActiveLibName <> '')); +end; + +function TMainForm.ActiveListViewToStrings: TStrings; +begin + Screen.Cursor := crHourGlass; + try + Result := TStringList.Create; + try + Result.Capacity := 256; + ListViewToStrings(Screen.ActiveControl as TListView, Result, True); + except + FreeAndNil(Result); + raise; + end; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TMainForm.Copy1Execute(Sender: TObject); +var + SL: TStrings; +begin + if Screen.ActiveControl is TRichEdit then + (Screen.ActiveControl as TRichEdit).CopyToClipboard + else + if Screen.ActiveControl is TListView then + begin + SL := ActiveListViewToStrings; + try + Clipboard.AsText := SL.Text; + finally + SL.Free; + end; + end; +end; + +procedure TMainForm.SelectAll1Execute(Sender: TObject); +begin + if Screen.ActiveControl is TRichEdit then + TRichEdit(Screen.ActiveControl).SelectAll + else + if Screen.ActiveControl is TListView then + ListViewSelectAll(TListView(Screen.ActiveControl)); +end; + +procedure TMainForm.GroupImports1Update(Sender: TObject); +begin + with TAction(Sender) do + begin + Enabled := IsPeDumpChildActive; + if Enabled then + Checked := TPeDumpChild(ActiveMDIChild).GroupImports + else + Checked := False; + end; +end; + +procedure TMainForm.GroupImports1Execute(Sender: TObject); +begin + with TPeDumpChild(ActiveMDIChild) do + begin + GroupImports := not GroupImports; + GroupImports1.Checked := GroupImports; + end; +end; + +procedure TMainForm.Search1Execute(Sender: TObject); +begin + TPeSearchChild.Create(Self); +end; + +function TMainForm.IsSearchChildActive: Boolean; +begin + Result := ActiveMDIChild is TPeSearchChild; +end; + +procedure TMainForm.ViewResources1Update(Sender: TObject); +begin + TAction(Sender).Enabled := IsPeDumpChildActive and + TPeDumpChild(ActiveMDIChild).HasDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; +end; + +procedure TMainForm.ViewResources1Execute(Sender: TObject); +var + F: TForm; +begin + with ActiveMDIChild as TPeDumpChild do + begin + F := FindPeResourceView(PeImage); + if F = nil then + TPeResViewChild.CreateEx(Self, PeImage) + else + F.BringToFront; + end; +end; + +function TMainForm.FindPeResourceView(APeImage: TJclPeImage): TForm; +var + I: Integer; +begin + Result := nil; + for I := 0 to MDIChildCount - 1 do + if (MDIChildren[I] is TPeResViewChild) and (TPeResViewChild(MDIChildren[I]).PeImage = APeImage) then + begin + Result := MDIChildren[I]; + Break; + end; +end; + +function TMainForm.IsPeResChildActive: Boolean; +begin + Result := ActiveMDIChild is TPeResViewChild; +end; + +procedure TMainForm.ViewResDetails1Update(Sender: TObject); +begin + with TAction(Sender) do + begin + Enabled := IsPeResChildActive; + if Enabled then + Checked := TPeResViewChild(ActiveMDIChild).ShowSpecialDirView + else + Checked := False; + end; +end; + +procedure TMainForm.ViewResDetails1Execute(Sender: TObject); +begin + with ViewResDetails1 do + begin + Checked := not Checked; + TPeResViewChild(ActiveMDIChild).ShowSpecialDirView := Checked; + end; +end; + +procedure TMainForm.ViewResHex1Update(Sender: TObject); +begin + with TAction(Sender) do + begin + Enabled := IsPeResChildActive; + if Enabled then + Checked := TPeResViewChild(ActiveMDIChild).ShowAsHexView + else + Checked := False; + end; +end; + +procedure TMainForm.ViewResHex1Execute(Sender: TObject); +begin + with ViewResHex1 do + begin + Checked := not Checked; + TPeResViewChild(ActiveMDIChild).ShowAsHexView := Checked; + end; +end; + +procedure TMainForm.Save1Update(Sender: TObject); +begin + TAction(Sender).Enabled := (Screen.ActiveControl is TListView) or + (IsPeResChildActive and TPeResViewChild(ActiveMDIChild).CanSaveResource) or + (IsGenDefChildActive and TPeGenDefChild(ActiveMDIChild).CanSave); +end; + +procedure TMainForm.About1Execute(Sender: TObject); +begin + ShowToolsAboutBox; +end; + +procedure TMainForm.SendMail1Execute(Sender: TObject); +begin + SendEmail; +end; + +procedure TMainForm.ShowUnitGen1Update(Sender: TObject); +begin + TAction(Sender).Enabled := IsPeDumpChildActive and + TPeDumpChild(ActiveMDIChild).HasDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; +end; + +procedure TMainForm.ShowUnitGen1Execute(Sender: TObject); +var + CurrFileName: TFileName; +begin + CurrFileName := (ActiveMDIChild as TPeDumpChild).FileName; + with TPeGenDefChild.Create(Self) do + FileName := CurrFileName; +end; + +function TMainForm.IsGenDefChildActive: Boolean; +begin + Result := ActiveMDIChild is TPeGenDefChild; +end; + +procedure TMainForm.FormShow(Sender: TObject); +begin + PostMessage(Handle, UM_CHECKPARAMSTR, 0, 0); +end; + +procedure TMainForm.UMCheckParamStr(var Message: TMessage); +var + I: Integer; + FileName: TFileName; +begin + for I := 1 to ParamCount do + begin + FileName := PathGetLongName(ParamStr(I)); + if (FileName <> '') and not (FileName[1] in ['-', '/']) then + OpenFile(FileName, False); + end; +end; + +procedure TMainForm.WMDropFiles(var Message: TWMDropFiles); +var + FilesCount, I: Integer; + FileName: array[0..MAX_PATH] of Char; +begin + FilesCount := DragQueryFile(Message.Drop, MAXDWORD, nil, 0); + for I := 0 to FilesCount - 1 do + begin + if (DragQueryFile(Message.Drop, I, @FileName, SizeOf(FileName)) > 0) and + IsValidPeFile(FileName) then + OpenFile(FileName, True); + end; + DragFinish(Message.Drop); + Message.Result := 0; + Application.BringToFront; +end; + +procedure TMainForm.UnmangleNames1Update(Sender: TObject); +begin + with TAction(Sender) do + begin + Enabled := IsPeDumpChildActive; + if Enabled then + Checked := TPeDumpChild(ActiveMDIChild).UnmangleNames + else + Checked := False; + end; +end; + +procedure TMainForm.UnmangleNames1Execute(Sender: TObject); +begin + with TPeDumpChild(ActiveMDIChild) do + begin + UnmangleNames := not UnmangleNames; + UnmangleNames1.Checked := UnmangleNames; + end; +end; + +procedure TMainForm.SelectAll1Update(Sender: TObject); +begin + TAction(Sender).Enabled := (Screen.ActiveControl is TListView) or + (Screen.ActiveControl is TRichEdit); +end; + +procedure TMainForm.Find1Update(Sender: TObject); +begin + TAction(Sender).Enabled := TFindTextForm.CanExecuteFind; +end; + +procedure TMainForm.Find1Execute(Sender: TObject); +begin + ShowFindDialog(Screen.ActiveControl as TListView); +end; + +procedure TMainForm.CoolBar1Resize(Sender: TObject); +begin + D4FixCoolBarResizePaint(Sender); +end; + +initialization + OleInitialize(nil); + +finalization + OleUninitialize; + +end. diff --git a/official/1.100/examples/windows/delphitools/peviewer/PeViewer_TLB.pas b/official/1.100/examples/windows/delphitools/peviewer/PeViewer_TLB.pas new file mode 100644 index 0000000..0175573 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/peviewer/PeViewer_TLB.pas @@ -0,0 +1,117 @@ +unit PeViewer_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1658 $ +// File generated on 4.6.2000 18:23:08 from Type Library described below. + +// ************************************************************************ // +// Type Lib: C:\Program Files\Borland\Delphi5\Projects\Tools\PeViewer\PeViewer.tlb (1) +// IID\LCID: {7DD35085-3A37-11D4-B06E-C61ABD372324}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\StdOle2.Tlb) +// ************************************************************************ // + +{$I jcl.inc} + +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. + +interface + +uses + Windows, ActiveX, Classes, Graphics, + {$IFDEF DELPHI5_UP} + OleServer, + {$ENDIF DELPHI5_UP} + OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + PeViewerMajorVersion = 1; + PeViewerMinorVersion = 0; + + LIBID_PeViewer: TGUID = '{7DD35085-3A37-11D4-B06E-C61ABD372324}'; + + IID_IPeViewerControl: TGUID = '{7DD35086-3A37-11D4-B06E-C61ABD372324}'; + CLASS_PeViewerControl: TGUID = '{7DD35088-3A37-11D4-B06E-C61ABD372324}'; +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IPeViewerControl = interface; + IPeViewerControlDisp = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + PeViewerControl = IPeViewerControl; + + +// *********************************************************************// +// Interface: IPeViewerControl +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {7DD35086-3A37-11D4-B06E-C61ABD372324} +// *********************************************************************// + IPeViewerControl = interface(IDispatch) + ['{7DD35086-3A37-11D4-B06E-C61ABD372324}'] + procedure OpenFile(const FileName: WideString); safecall; + procedure BringToFront; safecall; + end; + +// *********************************************************************// +// DispIntf: IPeViewerControlDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {7DD35086-3A37-11D4-B06E-C61ABD372324} +// *********************************************************************// + IPeViewerControlDisp = dispinterface + ['{7DD35086-3A37-11D4-B06E-C61ABD372324}'] + procedure OpenFile(const FileName: WideString); dispid 1; + procedure BringToFront; dispid 2; + end; + +// *********************************************************************// +// The Class CoPeViewerControl provides a Create and CreateRemote method to +// create instances of the default interface IPeViewerControl exposed by +// the CoClass PeViewerControl. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoPeViewerControl = class + class function Create: IPeViewerControl; + class function CreateRemote(const MachineName: string): IPeViewerControl; + end; + +implementation + +uses ComObj; + +class function CoPeViewerControl.Create: IPeViewerControl; +begin + Result := CreateComObject(CLASS_PeViewerControl) as IPeViewerControl; +end; + +class function CoPeViewerControl.CreateRemote(const MachineName: string): IPeViewerControl; +begin + Result := CreateRemoteComObject(MachineName, CLASS_PeViewerControl) as IPeViewerControl; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/resfix/ResFix.dof b/official/1.100/examples/windows/delphitools/resfix/ResFix.dof new file mode 100644 index 0000000..48fc6fe --- /dev/null +++ b/official/1.100/examples/windows/delphitools/resfix/ResFix.dof @@ -0,0 +1,145 @@ +[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=1 +UnsafeCode=1 +UnsafeCast=1 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir=..\..\..\..\bin +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +Packages=vcl;rtl;vclx;indy;vclie;xmlrtl;inetdbbde;inet;inetdbxpress;dbrtl;soaprtl;dsnap;VclSmp;dbexpress;vcldb;dbxcds;inetdb;bdertl;vcldbx;adortl;teeui;teedb;tee;ibxpress;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;EasyNSED7;Jcl +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=0 +MinorVer=5 +Release=4 +Build=15 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Petr Vones +FileDescription=ResFix utility +FileVersion=0.5.4.15 +InternalName=RESFIX +LegalCopyright=(c) 2002 Petr Vones +LegalTrademarks= +OriginalFilename=RESFIX.EXE +ProductName=ResFix utility for Win95 +ProductVersion=0.5.4 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlSearchPath] +Count=1 +Item0=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +[HistoryLists\hlOutputDirectorry] +Count=1 +Item0=..\..\..\..\bin diff --git a/official/1.100/examples/windows/delphitools/resfix/ResFix.dpr b/official/1.100/examples/windows/delphitools/resfix/ResFix.dpr new file mode 100644 index 0000000..c829783 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/resfix/ResFix.dpr @@ -0,0 +1,20 @@ +program ResFix; + +{$I jcl.inc} + +uses + Forms, + ResFixMain in 'ResFixMain.pas' {MainForm}, + About in '..\Common\About.pas' {AboutBox}, + ToolsUtils in '..\Common\ToolsUtils.pas', + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'ResFix'; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/delphitools/resfix/ResFix.res b/official/1.100/examples/windows/delphitools/resfix/ResFix.res new file mode 100644 index 0000000000000000000000000000000000000000..ef1acfc479f99f346dd04f179ddd5546f3a459db GIT binary patch literal 1700 zcmd^8zfapx5dKUIQB+hiFhG}j=l~3nL7`HY(h7(ai2`y^%7!AE2Grn0X+Z7f|H~j{ z$A3fz2DWzWP}O{Q&&Cd*suK$*pWnN??|#1b0Kg%~v0-k<=z1cx7l^UcRxTIq6tuvN zLw-lLVAKJ99;N``hafNu|J;%Tj7B3GqzGAJv+!@~66Jl05=tyl6o#RyR52Ze=h3Aq zMxvO$Jf~3=Do2?diJjhR7gQ!2Z6b?FQU4{I+!>zEWByN4<`Hp^krOC>w?pDR?kZK8n#{x{)qSJw;&ny<#a(1rc;uf&_=eg^jKx~5i8Bi3;`(>K|` z5Ca^;M+Y^oU9=h5$7l2i_Y~uz%1+;qtE@pPdW~m{w@%Cn`e+gVon5ymwKd5uSBdMe z>K?6ad{upo)mgWBHdKG8`TN8lD^`G>TBM$DjB%>AE~O#!2(6%$i_;`}zzmtciwaiB zRq`@-LKPJ0BfSk3@3Y=+u4<3HHCS66`- + OnResize = CoolBar1Resize + object ToolBar1: TToolBar + Left = 9 + Top = 0 + Width = 408 + Height = 22 + AutoSize = True + Caption = 'ToolBar1' + EdgeBorders = [] + Flat = True + Images = ImageList1 + TabOrder = 0 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = Open1 + end + object ToolButton2: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton2' + ImageIndex = 2 + Style = tbsSeparator + end + object ToolButton3: TToolButton + Left = 31 + Top = 0 + Action = Description1 + end + end + end + object StatusBar: TStatusBar + Left = 0 + Top = 338 + Width = 425 + Height = 19 + Panels = < + item + Width = 90 + end + item + Width = 50 + end> + SimplePanel = False + end + object ResListView: TListView + Left = 0 + Top = 26 + Width = 425 + Height = 255 + Align = alClient + Columns = < + item + Caption = 'Resource type' + Width = 100 + end + item + Caption = 'Resource name' + Width = 100 + end + item + Alignment = taRightJustify + Caption = 'Size' + Width = 60 + end + item + Alignment = taRightJustify + Caption = 'Fixed size' + Width = 70 + end> + ColumnClick = False + HotTrackStyles = [] + ReadOnly = True + RowSelect = True + TabOrder = 2 + ViewStyle = vsReport + OnCustomDrawItem = ResListViewCustomDrawItem + end + object MainMenu1: TMainMenu + Images = ImageList1 + Left = 8 + Top = 248 + object File1: TMenuItem + Caption = 'File' + object Open2: TMenuItem + Action = Open1 + end + object N1: TMenuItem + Caption = '-' + end + object Exit2: TMenuItem + Action = Exit1 + end + end + object Help1: TMenuItem + Caption = 'Help' + object Descriptionofbug1: TMenuItem + Action = Description1 + end + object N2: TMenuItem + Caption = '-' + end + object Support1: TMenuItem + Action = SendMail1 + end + object About11: TMenuItem + Action = About1 + end + end + end + object ActionList1: TActionList + Images = ImageList1 + Left = 40 + Top = 248 + object Open1: TAction + Caption = 'Open ...' + Hint = 'Open a PE file' + ImageIndex = 1 + ShortCut = 16463 + OnExecute = Open1Execute + end + object Exit1: TAction + Caption = 'Exit' + ImageIndex = 0 + OnExecute = Exit1Execute + end + object About1: TAction + Caption = 'About ...' + Hint = 'About' + OnExecute = About1Execute + end + object Description1: TAction + Caption = 'More about the bug' + Hint = 'Learn more about the bug in MSDN article' + ImageIndex = 2 + OnExecute = Description1Execute + end + object SendMail1: TAction + Caption = 'Support' + ImageIndex = 21 + OnExecute = SendMail1Execute + end + end + object ImageList1: TImageList + Left = 72 + Top = 248 + Bitmap = { + 494C010116001800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000006000000001002000000000000060 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000080000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF40FFFFFF40BFBFBF40FFFF + FF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFF + FF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF0000808000000000000000008000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF0000000000FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF0000808000000000000000000000000000BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408080 + 80408080804080808040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF408080 + 80408080804080808040FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000000000000000000000000000000000000000000 + 000000000000000000000000008000000000BFBFBF40FFFFFF40BFBFBF40FFFF + FF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFF + FF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF40FFFFFF40BFBFBF400000 + 0040FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000BFFFFF + FF00FFFFFF000000000000000000000000000000008000000000000000000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000008000000000FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFF0000000000FFFFFFBFFFFFFF00FFFFFF0000000000FFFFFFBFFFFF + FF00FFFFFF000000000000000000000000000000008000000000000000000000 + 00007F7F7FBFBFBFBF0000000000000000000000000000000000000000000000 + 00007F7F7F00000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40000000400000000000000000FFFFFFBFFFFF + FF00FFFFFF0000000000FFFFFFBFFFFFFF00FFFFFF0000000000FFFFFFBFFFFF + FF00FFFFFF0000000000000000000000000000000000000000007F7F7FBFBFBF + BF00BFBFBFBFBFBFBF00000000000000000000000000000000007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000000000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00000000BFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40000000400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000000000FF00BFBFBF000000 + FF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F00000000000000008000000000FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF40FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF4080000040FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 000000000000000000000000000000000000000000000000FF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F0000000080000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBF0000000000000000000000 + 000000000080000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF4000000040FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000BFFFFF + FF0000000000000000000000000000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF000000003F7F7F7F00000000800000 + 000000000080000000000000008000000000FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40800000408000004080000040FFFFFF4080000040FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF408000004080000040800000400000000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F000000008000000000000000800000 + 000000000080000000000000008000000000FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000000000 + 00000000003F7F7F7F0000000080000000000000008000000000000000800000 + 00000000008000000000000000800000000000000040FFFFFF40FFFFFF40FFFF + FF400000004000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF400000004000000040FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFFFF40FFFF + FF40FFFFFF40FFFFFF40FFFFFF40FFFFFF400000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF0000000000000000000000000000000000000000 + 00000000003F7F7F7F0000000000000000000000003F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF0000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000000000FFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF3F7F7F + 7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF3F7F7F + 7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 00000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000003F7F7F7F000000FF000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF0000FFFF3F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000000000FFFF0000FFFF0000FFFF0000FF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF00000000000000000000000000000000FF000000 + FF000000FF000000FF000000000000FF0000000000BFFF000000FF0000BFFF00 + 0000FF0000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000003F7F7F7F000000FF000000 + FF000000FF000000000000FF000000FF000000FF000000000000FF0000BFFF00 + 0000FF00003F7F7F7F0000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + FF000000000000FF000000FF000000FF000000FF000000FF0000000000BFFF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 000000FF000000FF000000FF000000FF000000FF000000FF000000FF00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF000000000000FFFF000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F0000000000FFFF0000000000000000000000000000000000000000 + 00000000000000FF000000FF000000FF000000FF000000FF0000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000FFFF000000000000FFFF000000000000FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFF0000000000FFFF0000000000000000000000000000000000000000 + 00000000003F7F7F7F0000000000000000000000003F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF000000000000FFFF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFF0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF000000000000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF0000FFFF00BFFFFF + 0000FFFF00BFFFFF0000FFFF0000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFF0000FFFF0000FFFF000000000000000000000000 + 00007F7F7F007F7F7F007F7F7F00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 0000000000BFFFFFFF000000000000000000FFFF0000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF00000000007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F0000000000FFFFFF00000000000000000000FFFF0000FFFF0000FF + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + FF000000FF000000FF0000000000FFFFFF00000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000003F7F7F7F0000FFFF3F7F7F + 7F000000000000000000000000BFFFFFFF000000000000000000000000000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF000000000000000000FFFFFF000000 + 000000000000000000000000000000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF0000000000000000000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFFBFFFFFFF000000000000000000FFFF00000000000000FFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF0000000000FFFF0000FFFF0000FFFF + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F00FFFFFF007F7F7F00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000000000BFFFFFFF00000000BFBFBFBF00FFFFFF000000 + 0000FFFFFF0000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000000000000000000000BFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF007F7F7F007F7F + 7F00FFFFFF007F7F7F007F7F7F007F7F7F00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + 0000FFFF0000FFFF000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF0000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFF000000FF0000BFFF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FFFF0000FFFF00000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF0000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF0000FFFF0000FFFF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000808080008080800080808000000000000000 + 00000000000000000000000000000000000000000000BFBFBF00FFFFFF00BFBF + BF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBF + BF00FFFFFF000000FF00FFFFFF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000000000000000000000FFFFFF0000000000FFFF + FF00000000000000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF008000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000080000000800000008000 + 00008000000080000000FFFFFF00800000008000000080000000800000008000 + 0000FFFFFF008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00FFFFFF0000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF007F7F7F000000FF007F7F7F00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF000000FF000000FF000000FF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF007F7F7F000000FF007F7F7F00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F0000000000000000007F7F7F00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00BFBFBF00000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000080000000800000008000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F007F7F7F0000FFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF0000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 00008000000080000000FFFFFF008000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F0000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF0000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF000000FF007F7F7F0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF0080000000800000008000000080000000800000008000 + 00008000000080000000800000008000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000000000000000FFFFFF0000000000000000000000 + 00000000FF0000000000000000007F7F7F000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000FFFF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000000000000000000008000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF008000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF00000000000000000000000000FF000000FF000000FF00 + 0000FF000000FF00000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000000000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000FF000000FF00 + 0000FF0000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF00FFFFFF0000FFFF00FFFF + FF007F7F7F007F7F7F0000FFFF00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000080000000FFFFFF008000 + 000080000000800000008000000080000000800000008000000080000000FFFF + FF008000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF00000000000000000000000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0000FFFF00FFFFFF0000FF + FF000000FF000000FF00FFFFFF0000FFFF007F7F7F000000FF000000FF0000FF + FF00FFFFFF0000FFFF00FFFFFF00000000000000000080000000FFFFFF008000 + 0000800000008000000080000000800000008000000080000000800000008000 + 00008000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF000000FF000000FF007F7F7F00FFFFFF007F7F7F000000FF000000FF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000080000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00800000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF000000000000000000000000000000FF000000FF000000 + FF00000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF000000FF000000FF000000FF000000FF000000FF00FFFFFF0000FF + FF00FFFFFF0000FFFF0000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 00000000000000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF000000000000000000000000000000FF000000FF000000 + FF0000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF000000FF000000FF000000FF00FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000080000000800000008000 + 00008000000080000000800000008000000080000000FFFFFF00800000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF00000000000000000000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000080000000800000008000 + 0000800000008000000080000000800000008000000080000000800000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 7F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 7F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FF000000FF000000FF000000FF000000FF000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000000 + 000000000000000000000000000000000000FF000000FF000000FF000000FF00 + 0000FF000000FF000000BFBFBF0000000000BFBFBF00FF000000FF000000FF00 + 0000FF000000FF000000FF000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF00000000007F7F7F0000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF000000 + 0000008080000080800000808000008080000080800000808000008080000080 + 80000080800000000000000000000000000000000000FFFFFF00000000007F7F + 7F007F7F7F0000000000FFFFFF007F7F7F00FFFFFF00000000007F7F7F007F7F + 7F0000000000FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000080800000808000008080000080800000808000008080000080 + 8000008080000080800000000000000000007F7F7F0000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000007F7F7F000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F7F7F0000000000FFFFFF000000 + 00000000000000000000FFFFFF007F7F7F00FFFFFF0000000000000000000000 + 0000FFFFFF00000000007F7F7F000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000BFBFBF0000000000FF000000FF000000FF00 + 00000000FF00FF000000FF000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 000000000000000000000000000000000000000000007F7F7F0000000000FFFF + FF000000000000000000FFFFFF007F7F7F00FFFFFF000000000000000000FFFF + FF00000000007F7F7F00000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF000000000000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000007F7F7F00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F00FFFF000000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F00FFFF0000FFFF00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000600000000100010000000000000300000000000000000000 + 000000000000000000000000FFFFFF008003C3807F7F7F008003C3007F7F7F00 + 8003C2010000003F8003C0030000003F8003C003BFBFBF008003C003BFBFBF00 + 80030003BFBFBFBF80030003BFBFBFBF800300030000FF00800300030000FF00 + 80030003BFBFBF0080030007BFBFBF008003000F0000FF008007003F00000000 + 800F80FF00000000801FC3FF00000000FFFFFFFFFFFFBFFF00010001F83FBFFF + 000100011010B04900010001E00F807F1FF11FF1C007B07F1DF11FF18003B9FF + 1CF118318003BFFF1C7118318003B0491C3118318003807F1C7118318003B07F + 1CF11831C007B9FF1DF11FF1E00FBFFF1FF11FF13018048F00010001F83F07FF + 00010001FFFF07FF00010001FFFF9FFFFFFF8000FFE3FC01FFF88000FC418C01 + 20F8C00088000401007FE00000000401007CF00000000401003CF80000008C01 + 000FFC000000FC01000406000000FC01000C07000000040301FF018000000407 + E3FC01800000040FFFFC0060000007FFFFFFC06000010603FFF8C0600001FF07 + FFF8F044000DFF8FFFFFF07ED553FFDFFFFFFFFFFFFF800180038003C0070000 + 80038003BFEB00008003800300050000800380037E310000800380037E350000 + 8003800300060000800380037FEA0000800380038014E00780038003C00AE007 + 80038003E001E00780038003E007E00780038003F007E00F80038003F003E01F + FFFFFFFFF803E03FFFFFFFFFFFFFE07FFC00FE7FFFFFFC00FC00FE1FF83FFC00 + FC00FC07E00FFC00FC00FC01C007FC000000F8008003E0000000F8008003E000 + 000000000001E000000000000001E00700230001000180070001003200018007 + 0000003E000180070023003E8003801F0063003E8003801F00C3001DC007801F + 01070023E00F801F03FF003FF83FFFFFC007FFFFFFFFFF00C007FFFFFFFFFF00 + C007001FF83FFF00C007000F0001FF00C007000700010000C007000300010000 + C007000100010000C007000000010000C007001F80030023C007001F80030001 + C007001F80030000C0078FF1C1070023C007FFF9E38F0063C007FF75FFFF00C3 + C007FF8FFFFF0107C007FFFFFFFF03FF00000000000000000000000000000000 + 000000000000} + end + object OpenFileDialog: TOpenDialog + Filter = + 'PE Exe files (*.exe;*.dll;*.bpl)|*.exe;*.dll;*.bpl|All files (*.' + + '*)|*.*' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 104 + Top = 248 + end +end diff --git a/official/1.100/examples/windows/delphitools/resfix/ResFixMain.pas b/official/1.100/examples/windows/delphitools/resfix/ResFixMain.pas new file mode 100644 index 0000000..d825f2d --- /dev/null +++ b/official/1.100/examples/windows/delphitools/resfix/ResFixMain.pas @@ -0,0 +1,263 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is ResFixMain.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit ResFixMain; + +{$I jcl.inc} +{$IFDEF SUPPORTS_PLATFORM_WARNINGS} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF SUPPORTS_PLATFORM_WARNINGS} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ToolWin, ImgList, ActnList, Menus, JclPeImage, StdCtrls, + ExtCtrls; + +type + TMainForm = class(TForm) + CoolBar1: TCoolBar; + ToolBar1: TToolBar; + ToolButton1: TToolButton; + MainMenu1: TMainMenu; + ActionList1: TActionList; + ImageList1: TImageList; + StatusBar: TStatusBar; + Open1: TAction; + Exit1: TAction; + About1: TAction; + File1: TMenuItem; + Open2: TMenuItem; + N1: TMenuItem; + Exit2: TMenuItem; + Help1: TMenuItem; + About11: TMenuItem; + Description1: TAction; + ToolButton2: TToolButton; + ToolButton3: TToolButton; + Descriptionofbug1: TMenuItem; + N2: TMenuItem; + OpenFileDialog: TOpenDialog; + ResListView: TListView; + Bevel1: TBevel; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + MinResLabel: TLabel; + MaxResLabel: TLabel; + FactorLabel: TLabel; + SendMail1: TAction; + Support1: TMenuItem; + procedure Exit1Execute(Sender: TObject); + procedure Description1Execute(Sender: TObject); + procedure About1Execute(Sender: TObject); + procedure Open1Execute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure ResListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure SendMail1Execute(Sender: TObject); + procedure CoolBar1Resize(Sender: TObject); + private + FPeImage: TJclPeImage; + procedure OpenFile(const FileName: TFileName); + procedure ProcessFile; + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +uses About, ToolsUtils, JclLogic, JclShell, JclSysUtils; + +{$R *.DFM} + +resourcestring + RsCheckApp = 'It is recommended to check the application. Would you like to start it ?'; + RsDescriptionURL = 'http://support.microsoft.com/support/kb/articles/Q182/8/19.asp'; + RsFixed = 'File was fixed'; + RsNoFixes = 'Not fixes needed'; + +type + TJclPeImageHack = class(TJclPeImage); + +{ TMainForm } + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FPeImage := TJclPeImage.Create; + TJclPeImageHack(FPeImage).ReadOnlyAccess := False; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FPeImage); +end; + +procedure TMainForm.Exit1Execute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.Description1Execute(Sender: TObject); +begin + Win32Check(ShellExecEx(RsDescriptionURL)); +end; + +procedure TMainForm.About1Execute(Sender: TObject); +begin + ShowToolsAboutBox; +end; + +procedure TMainForm.Open1Execute(Sender: TObject); +begin + with OpenFileDialog do + begin + FileName := ''; + if Execute then OpenFile(FileName); + end; +end; + +procedure TMainForm.OpenFile(const FileName: TFileName); +begin + FPeImage.FileName := FileName; + StatusBar.Panels[0].Text := ''; + StatusBar.Panels[1].Text := FileName; + ProcessFile; +end; + +procedure TMainForm.ProcessFile; +var + MinResSize, MaxResSize: Integer; + ScalingFactor: Integer; + NeedFix, AnyFixes: Boolean; + FileName: TFileName; + + procedure ScanResources(List: TJclPeResourceList); + var + I, Size: Integer; + Item: TJclPeResourceItem; + begin + for I := 0 to List.Count - 1 do + begin + Item := List[I]; + if Item.IsDirectory then + ScanResources(Item.List) + else + begin + Size := Item.DataEntry^.Size; + MinResSize := Min(MinResSize, Size); + MaxResSize := Max(MaxResSize, Size); + with ResListView.Items.Add do + begin + Caption := Item.ResourceTypeStr; + Data := Item; + SubItems.Add(Item.ParentItem.Name); + SubItems.Add(Format('%u', [Size])); + SubItems.Add(''); + end; + end; + end; + end; + + procedure FixResources(List: TJclPeResourceList); + var + I, Size: Integer; + Item: TJclPeResourceItem; + begin + for I := 0 to List.Count - 1 do + begin + Item := List[I]; + if Item.IsDirectory then + FixResources(Item.List) + else + if Item.ResourceType in [rtCursor, rtIcon, rtCursorEntry, rtIconEntry] then + begin + Size := Item.DataEntry^.Size; + if (Size mod ScalingFactor <> 0) or (Size < ScalingFactor * 2) then + begin + Size := Max((Size div ScalingFactor + 1) * ScalingFactor, ScalingFactor * 2); + Item.DataEntry^.Size := Size; + AnyFixes := True; + ResListView.FindData(0, Item, True, False).SubItems[2] := Format('%u', [Size]); + end; + end; + end; + end; + +begin + MinResSize := MaxInt; + MaxResSize := 0; + FileName := FPeImage.FileName; + ResListView.Items.BeginUpdate; + try + ResListView.Items.Clear; + ScanResources(FPeImage.ResourceList); + + ScalingFactor := ((MaxResSize div 65536) div 2 + 1) * 2; + MinResLabel.Caption := Format('%d', [MinResSize]); + MaxResLabel.Caption := Format('%d', [MaxResSize]); + FactorLabel.Caption := Format('%d', [ScalingFactor]); + + NeedFix := (MaxResSize >= 65536) and (MinResSize mod ScalingFactor <> 0); + AnyFixes := False; + if NeedFix then FixResources(FPeImage.ResourceList); + FPeImage.FileName := ''; + ListViewFocusFirstItem(ResListView); + finally + ResListView.Items.EndUpdate; + end; + with StatusBar.Panels[0] do + if AnyFixes then + begin + Text := RsFixed; + if MessBox(RsCheckApp, MB_YESNO or MB_ICONQUESTION) = ID_YES then + ShellExecEx(FileName); + end else + Text := RsNoFixes; +end; + +procedure TMainForm.ResListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +begin + if Item.SubItems[2] <> '' then + Sender.Canvas.Font.Color := clRed; +end; + +procedure TMainForm.SendMail1Execute(Sender: TObject); +begin + SendEmail; +end; + +procedure TMainForm.CoolBar1Resize(Sender: TObject); +begin + D4FixCoolBarResizePaint(Sender); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/screenjpg/Main.dfm b/official/1.100/examples/windows/delphitools/screenjpg/Main.dfm new file mode 100644 index 0000000..071988c --- /dev/null +++ b/official/1.100/examples/windows/delphitools/screenjpg/Main.dfm @@ -0,0 +1,901 @@ +object MainForm: TMainForm + Left = 192 + Top = 107 + Width = 561 + Height = 447 + Caption = 'ScreenJPG' + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 300 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + Position = poDefaultPosOnly + ShowHint = True + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object CoolBar1: TCoolBar + Left = 0 + Top = 0 + Width = 553 + Height = 26 + AutoSize = True + Bands = < + item + Control = ToolBar1 + ImageIndex = -1 + MinHeight = 22 + Width = 549 + end> + OnResize = CoolBar1Resize + object ToolBar1: TToolBar + Left = 9 + Top = 0 + Width = 536 + Height = 22 + AutoSize = True + Caption = 'ToolBar1' + EdgeBorders = [] + Flat = True + Images = ImageList1 + TabOrder = 0 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = OpenFile1 + end + object ToolButton3: TToolButton + Left = 23 + Top = 0 + Action = SaveFile1 + end + object ToolButton4: TToolButton + Left = 46 + Top = 0 + Width = 8 + Caption = 'ToolButton4' + ImageIndex = 1 + Style = tbsSeparator + end + object ToolButton5: TToolButton + Left = 54 + Top = 0 + Action = Paste1 + end + object ToolButton6: TToolButton + Left = 77 + Top = 0 + Width = 8 + Caption = 'ToolButton6' + ImageIndex = 2 + Style = tbsSeparator + end + object RatioComboBox: TComboBox + Left = 85 + Top = 0 + Width = 58 + Height = 21 + Hint = 'Quality' + TabStop = False + Style = csDropDownList + Color = clBtnFace + Ctl3D = True + DropDownCount = 10 + Enabled = False + ItemHeight = 13 + ParentCtl3D = False + TabOrder = 0 + OnChange = RatioComboBoxChange + end + object ColorComboBox: TComboBox + Left = 143 + Top = 0 + Width = 58 + Height = 21 + Hint = 'Color' + TabStop = False + Style = csDropDownList + Color = clBtnFace + Ctl3D = True + Enabled = False + ItemHeight = 13 + Items.Strings = ( + 'B/W' + 'Color') + ParentCtl3D = False + TabOrder = 1 + OnChange = RatioComboBoxChange + end + end + end + object StatusBar1: TStatusBar + Left = 0 + Top = 382 + Width = 553 + Height = 19 + Panels = < + item + Width = 120 + end + item + Width = 50 + end> + SimplePanel = False + end + object ScrollBox: TScrollBox + Left = 0 + Top = 26 + Width = 553 + Height = 356 + HorzScrollBar.Tracking = True + VertScrollBar.Tracking = True + Align = alClient + TabOrder = 2 + object Image1: TImage + Left = 0 + Top = 0 + Width = 549 + Height = 352 + Align = alClient + AutoSize = True + end + end + object MainMenu1: TMainMenu + Images = ImageList1 + Left = 8 + Top = 344 + object File1: TMenuItem + Caption = 'File' + object Open1: TMenuItem + Action = OpenFile1 + end + object SaveAs1: TMenuItem + Action = SaveFile1 + end + object N1: TMenuItem + Caption = '-' + end + object Exit2: TMenuItem + Action = Exit1 + end + end + object Edit1: TMenuItem + Caption = 'Edit' + object Paste11: TMenuItem + Action = Paste1 + end + end + object Help1: TMenuItem + Caption = 'Help' + object About2: TMenuItem + Action = About1 + end + end + end + object ImageList1: TImageList + Left = 40 + Top = 344 + Bitmap = { + 494C010111001300040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000005000000001002000000000000050 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F00FFFFFF00000000000000000010C0000040AF60004FEF6000408F + 70001F8060000FC0100040EF6F00904F7F009F6F600090EF6F00608F6F00102F + 600090CF2F00A04F70000F6F60005F2F6F0070EF60004FC01000B0AF6000908F + 70009F6F600090EF6F00608F6F00102F600090CF2F00A04F70000F6F60005F2F + 6F0070EF60004FA000000F8F6F004FEF600070EF000040206000606F4000602F + 6F002FCF6F00A00F0F00A02F600010EF4F00804F5000000F0000000F00000010 + 00000F0010008000000030204F000010000000000000000000007F7F7F007F7F + 7F0000000000FFFFFF0000000000000000000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000009F8F70000F8F7000AF6F7000102F + 6000902F300020804F002FCF6000A04F000000600000A0EF6F00806F0000F02F + 00002FE050004F8F6000A00F6F001F202F0010C0000040AF60004FEF6000408F + 700010601000300050000FCF6F002F8F6F009FCF0F000FA00000BF2F6F00208F + 7000404F0000900000000FA00000BF2F6F00208F7000404F0000900000000060 + 0F009F2F6F006F0F700060AF6000802F600070AF6000600F0F00000000005080 + 50009F6F600090EF6F00608F6F0010EF6F0000000000000000007F7F7F00FFFF + FF007F7F7F0000000000FFFFFF00000000000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000002FAF00001F8F7000606F3000202F + 0F003FA04000702F6000108F6F002F8F600040400F004F8F70002FAF6F0040AF + 60004FEF6000408F700010A00F005F0050000F4F70002FCF6F00A06F4000A08F + 6F009F80400040000F00A02F600010EF4F00908F60002F4F70001020000040E0 + 4F00706F4000402F600070EF60002FEF00009F4050000F8F70004FEF6F001FEF + 6F006F4F60007F4F40007F0F7F001F0F6F000FCF6F003FAF60006F204F00A0AF + 60006F6F700070605000A04F70004FCF6F0000000000000000007F7F7F00FFFF + FF00000000007F7F7F0000000000FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F0F7F001F0F6F000FCF6F003FAF + 6000000000004F8050001FEF6F006F4F60007F4F40007F0F7F006F6040007F8F + 6F007F4F70001FEF6F006F4F60007F4F40007F0F7F0020804F002FCF6000A06F + 0000BF1000001F8050007F0F7000100000002FE050004F8F6000A00F6F001040 + 3F0030004F002F2F6F003F0F6F00A04F0000AFE00000A02F6000106F5000A0EF + 6F00800F0F002F605000A02F7F0060AF600000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F007F7F7F000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000000000007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF0000000000FFFFFF007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF007F7F7F00FFFFFF007F7F7F00FFFFFF000000000000000000000000000000 + 00007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F00FFFF + FF007F7F7F007F7F7F007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF007F7F7F00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F007F7F7F000000000000000000000000000000000000000000000000000000 + 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 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008000000080000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000800000000000000000000000800000000000000000000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000800000000000000000000000800000000000000080000000000000000000 + 0000800000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000800000000000000000000000800000000000000080000000000000000000 + 0000800000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000008000000080000000800000000000000080000000000000000000 + 0000800000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000800000000000000080000000800000008000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000800000000000000080000000000000000000 + 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 + 0000000000000000000000000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000080000000FFFFFF0000000000000000000000 + 00000000000000000000FFFFFF00800000000000000000000000000000000000 + 000000000000000000000000000000FFFF0000FFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 0000000000000000000000000000808080008080800080808000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000080000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF0000000000000000000000 + 00000000000000000000FFFFFF00800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000800000008000 + 0000800000008000000080000000000000000000000000000000000000000000 + 000080000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF000000 + 000000000000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000800000008000 + 0000800000008000000000000000000000000000000000000000000000000000 + 000000000000800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF000000000000000000FFFF + FF00800000008000000080000000800000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000800000008000 + 0000800000000000000000000000000000000000000000000000000000000000 + 000000000000800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF000000 + 000000000000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080000000FFFFFF008000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000800000008000 + 0000000000008000000000000000000000000000000000000000000000000000 + 000000000000800000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0080000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF00800000008000000000000000000000000000000000000000000000000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000800000000000 + 0000000000000000000080000000800000000000000000000000000000000000 + 000080000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF000000 + 000000000000FFFFFF0000000000800000008000000080000000800000008000 + 0000800000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000008000000080000000800000008000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000FFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000000000000000000000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 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 + 0000000000000000000080000000800000008000000080000000800000008000 + 0000800000008000000080000000800000000000000000000000000000000000 + 7F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000000000000000000000000 + 0000000000000000000080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 7F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000000 + 0000000000000000000000000000000000000000000000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000080808000008080008080 + 8000008080008080800080000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF00800000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00000000000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000000000000000000000000000000000000000000000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000000808000808080000080 + 8000808080000080800080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00800000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF000000 + 0000008080000080800000808000008080000080800000808000008080000080 + 8000008080000000000000000000000000000000000000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000080808000008080008080 + 8000008080008080800080000000FFFFFF00000000000000000000000000FFFF + FF00800000008000000080000000800000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000080800000808000008080000080800000808000008080000080 + 8000008080000080800000000000000000000000000000000000008080000080 + 8000008080000080800000808000008080000080800000808000008080000080 + 8000008080000080800000000000000000000000000000808000808080000080 + 8000808080000080800080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0080000000FFFFFF0080000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000008080000080800000000000000000000000000080808000008080008080 + 8000008080008080800080000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00800000008000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000000808000808080000080 + 8000808080000080800080000000800000008000000080000000800000008000 + 0000800000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000080808000008080008080 + 8000008080008080800000808000808080000080800080808000008080008080 + 8000008080000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000000808000808080000000 + 0000000000000000000000000000000000000000000000000000000000008080 + 8000808080000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF000000000000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000080800000000000000000000000000080808000808080000000 + 0000000000000000000000000000000000000000000000000000000000008080 + 8000008080000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000808000808080000080 + 80000000000000FFFF00000000000000000000FFFF0000000000808080000080 + 8000808080000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000008080000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F00FFFF000000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F00FFFF0000FFFF00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000500000000100010000000000800200000000000000000000 + 000000000000000000000000FFFFFF00C00300780000E0FFCBF3000000000078 + C5F3000000000000CAF3000000001084CCF3000000000000CCF3108410840000 + CCF3008400000000CCF3000000000000CCF3000000000000CC73000000840000 + CCF3000000000000CCF3000000000000C8F3000000000000C0F3000000000000 + C003000000000000C007E0FFE0FFE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF8FFFC007C007C0078C03FFFFFFFFFFFF8FFFC03FF83FF807FFFF + FFFFFFFFFFFFFFFFC007C007C0078FFFFFFFFFFFFFFF8C03C03FF01FF8078FFF + FFFFFFFFFFFFFFFFC007C007C007FFFFFFFFFFFFFFFF8FFFC03FF83FF8078C03 + FFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFFFFFFFF + F6CFFFFFFFFFE00FF6B7FFFFFFFFFFFFF6B7F00F81FFF83FF8B7F8C7E3FFF39F + FE8FF8C7F1FFF39FFE3FF8C7F8FFF39FFF7FF80FFC7FF39FFE3FF8C7FE3FF39F + FEBFF8C7FF1FF39FFC9FF8C7FF8FF39FFDDFF00FFF03E10FFDDFFFFFFFFFFFFF + FDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC007FFFFFFFF + FE00BFEBFFFFC007FE000005FFFFC007FE007E31FFFFC00780007E35FFF7C007 + 80000006C1F7C00780007FEAC3FBC00780008014C7FBC0078001C00ACBFBC007 + 8003E001DCF7C0078007E007FF0FC007807FF007FFFFC00F80FFF003FFFFC01F + 81FFF803FFFFC03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC007FFFFC001FC00C007 + 001F80318000C007000F80310000C007000780310000C007000380010000C007 + 000180010001C007000080010003C007001F8FF10003C007001F8FF10003C007 + 001F8FF10003C0078FF18FF10FC3C007FFF98FF10003C007FF758FF58007C007 + FF8F8001F87FC007FFFFFFFFFFFFC00700000000000000000000000000000000 + 000000000000} + end + object ActionList1: TActionList + Images = ImageList1 + Left = 72 + Top = 344 + object OpenFile1: TAction + Caption = 'Open ...' + Hint = 'Open a file' + ImageIndex = 0 + ShortCut = 16463 + OnExecute = OpenFile1Execute + end + object Exit1: TAction + Caption = 'Exit' + ImageIndex = 3 + OnExecute = Exit1Execute + end + object SaveFile1: TAction + Caption = 'Save As ...' + ImageIndex = 1 + ShortCut = 16467 + OnExecute = SaveFile1Execute + OnUpdate = SaveFile1Update + end + object Paste1: TAction + Caption = 'Paste picture' + Hint = 'Paste picture' + ImageIndex = 2 + ShortCut = 16470 + OnExecute = Paste1Execute + OnUpdate = Paste1Update + end + object About1: TAction + Caption = 'About...' + OnExecute = About1Execute + end + end + object SaveDialog1: TSaveDialog + DefaultExt = 'jpeg' + Filter = 'JPEG images|*.jpg;*.jpeg' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 138 + Top = 348 + end + object OpenDialog1: TOpenPictureDialog + Filter = 'Bitmaps (*.bmp)|*.bmp||*.emf' + Left = 106 + Top = 348 + end +end diff --git a/official/1.100/examples/windows/delphitools/screenjpg/Main.pas b/official/1.100/examples/windows/delphitools/screenjpg/Main.pas new file mode 100644 index 0000000..bb8532c --- /dev/null +++ b/official/1.100/examples/windows/delphitools/screenjpg/Main.pas @@ -0,0 +1,285 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is Main.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit Main; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ToolWin, ActnList, ImgList, Menus, ExtCtrls, StdCtrls, Jpeg, + ClipBrd, ExtDlgs; + +type + TMainForm = class(TForm) + CoolBar1: TCoolBar; + ToolBar1: TToolBar; + StatusBar1: TStatusBar; + MainMenu1: TMainMenu; + ImageList1: TImageList; + ActionList1: TActionList; + OpenFile1: TAction; + Exit1: TAction; + File1: TMenuItem; + Open1: TMenuItem; + N1: TMenuItem; + Exit2: TMenuItem; + ToolButton1: TToolButton; + ScrollBox: TScrollBox; + Image1: TImage; + RatioComboBox: TComboBox; + SaveFile1: TAction; + SaveAs1: TMenuItem; + ToolButton3: TToolButton; + SaveDialog1: TSaveDialog; + ColorComboBox: TComboBox; + Paste1: TAction; + ToolButton4: TToolButton; + ToolButton5: TToolButton; + ToolButton6: TToolButton; + Edit1: TMenuItem; + Paste11: TMenuItem; + Help1: TMenuItem; + OpenDialog1: TOpenPictureDialog; + About1: TAction; + About2: TMenuItem; + procedure Exit1Execute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure OpenFile1Execute(Sender: TObject); + procedure RatioComboBoxChange(Sender: TObject); + procedure SaveFile1Execute(Sender: TObject); + procedure Paste1Execute(Sender: TObject); + procedure Paste1Update(Sender: TObject); + procedure SaveFile1Update(Sender: TObject); + procedure About1Execute(Sender: TObject); + procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure CoolBar1Resize(Sender: TObject); + private + FJpegImage: TJPEGImage; + FFileName: TFileName; + FModified: Boolean; + FOriginalPicture: TPicture; + procedure CompressPicture; + procedure FillCombos; + procedure EnableCombos; + public + function CheckSaved: Boolean; + procedure OpenFile; + function SaveFile: Boolean; + procedure UpdatePicture; + property Modified: Boolean read FModified; + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.DFM} + +uses + ToolsUtils, JclSysUtils; + +resourcestring + RsSaveImage = 'Save current image ?'; + RsJpegSize = 'JPEG Size: %.0n'; + +function TMainForm.CheckSaved: Boolean; +begin + Result := not Modified; + if not Result then + case MessBox(RsSaveImage, MB_ICONEXCLAMATION or MB_YESNOCANCEL) of + ID_YES: Result := SaveFile; + ID_NO: Result := True; + else + Result := False; + end; +end; + +procedure TMainForm.CompressPicture; +var + Ratio: Integer; +begin + with RatioComboBox do Ratio := Integer(Items.Objects[ItemIndex]); + FJpegImage.Grayscale := (ColorComboBox.ItemIndex = 0); + FJpegImage.CompressionQuality := Ratio; + FJpegImage.Assign(FOriginalPicture.Graphic); +end; + +procedure TMainForm.EnableCombos; +begin + RatioComboBox.Enabled := True; + RatioComboBox.Color := clWindow; + ColorComboBox.Enabled := True; + ColorComboBox.Color := clWindow; +end; + +procedure TMainForm.Exit1Execute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.OpenFile; +begin + if CheckSaved then + begin + with OpenDialog1 do + begin + FileName := ''; + if Execute then + begin + FFileName := FileName; + FOriginalPicture.LoadFromFile(FileName); + UpdatePicture; + end; + end; + end; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FJpegImage := TJPEGImage.Create; + FOriginalPicture := TPicture.Create; + Image1.Align := alNone; + FillCombos; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FOriginalPicture); + FreeAndNil(FJpegImage); +end; + +procedure TMainForm.UpdatePicture; +var + MemStream : TMemoryStream; +begin + Screen.Cursor := crHourGlass; + try + EnableCombos; + CompressPicture; + MemStream := TMemoryStream.Create; + try + FJpegImage.SaveToStream(MemStream); + StatusBar1.Panels[0].Text := Format(RsJpegSize, [IntToExtended(MemStream.Size)]); + MemStream.Position := 0; + FJpegImage.LoadFromStream(MemStream); + Image1.Picture.Assign(FJpegImage); + Image1.Update; + finally + MemStream.Free; + end; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TMainForm.OpenFile1Execute(Sender: TObject); +begin + OpenFile; +end; + +procedure TMainForm.FillCombos; +const + QualityTable: array [0..10] of TJPEGQualityRange = + (10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100); +var + I: Integer; +begin + with RatioComboBox do + begin + for I := Low(QualityTable) to High(QualityTable) do + Items.AddObject(Format('%d%%', [QualityTable[I]]), Pointer(QualityTable[I])); + ItemIndex := 8; + end; + ColorComboBox.ItemIndex := 1; +end; + +procedure TMainForm.RatioComboBoxChange(Sender: TObject); +begin + UpdatePicture; + FModified := True; +end; + +procedure TMainForm.SaveFile1Execute(Sender: TObject); +begin + SaveFile; +end; + +procedure TMainForm.Paste1Execute(Sender: TObject); +begin + if CheckSaved then + begin + FOriginalPicture.Assign(Clipboard); + FFileName := ''; + UpdatePicture; + FModified := True; + end; +end; + +procedure TMainForm.Paste1Update(Sender: TObject); +begin + Paste1.Enabled := Clipboard.HasFormat(CF_BITMAP); +end; + +procedure TMainForm.SaveFile1Update(Sender: TObject); +begin + SaveFile1.Enabled := Assigned(Image1.Picture.Graphic); +end; + +function TMainForm.SaveFile: Boolean; +begin + Result := False; + with SaveDialog1 do + begin + FileName := ChangeFileExt(FFileName, '.jpeg'); + if Execute then + begin + FJpegImage.SaveToFile(FileName); + Result := True; + FModified := False; + end; + end; +end; + +procedure TMainForm.About1Execute(Sender: TObject); +begin + ShowToolsAboutBox; +end; + +procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +begin + CanClose := CheckSaved; +end; + +procedure TMainForm.CoolBar1Resize(Sender: TObject); +begin + D4FixCoolBarResizePaint(Sender); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dof b/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dof new file mode 100644 index 0000000..02b884c --- /dev/null +++ b/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dof @@ -0,0 +1,134 @@ +[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= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=0 +MinorVer=5 +Release=4 +Build=3 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Petr Vones +FileDescription=Screen to JPEG convertor +FileVersion=0.5.4.3 +InternalName=PEVIEWER +LegalCopyright=(c) 2002 Petr Vones +LegalTrademarks= +OriginalFilename=SCREENJPG.EXE +ProductName=Screen to JPEG convertor +ProductVersion=0.5.4 diff --git a/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dpr b/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dpr new file mode 100644 index 0000000..ef7a5f8 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.dpr @@ -0,0 +1,20 @@ +program ScreenJPG; + +{$I jcl.inc} + +uses + Forms, + Main in 'Main.pas' {MainForm}, + About in '..\Common\About.pas' {AboutBox}, + ToolsUtils in '..\Common\ToolsUtils.pas', + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.Title := 'ScreenJPG'; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.res b/official/1.100/examples/windows/delphitools/screenjpg/ScreenJPG.res new file mode 100644 index 0000000000000000000000000000000000000000..0a04ff159d338f0cde01081cd55830003164c4f2 GIT binary patch literal 1696 zcmd^;y>1gx5QUHNh7b`27jCH7f+A2LD;OlI1SL)s6o_RbgJ>cv7!%>xmSd3U{9X={ z`|LwdP|!h1fiU09df7EefhcGgd-mR$Id^`}?v^V|lK5*hiWi=2(UB&T2?1-umTA23jQcX@d5LB+i$u|QJa(5mmZR}$ zbmoqUIhM~(3A)4WD77PtbK2vEO6}M?vn}MPKeFT6DW1b~=l@HaR|JdBU(5!Macak$ zxNVqJ?92Ert$&kle3h=5ev}sfl@=wH(CKtVkM&TydV+3hpEZ%}y|CMmQy3QfR@g1d zshHR7t`#zOX(33?7xQJd4b^qPv!WWiU9WK9^|slYdmC&zi_Xi? z?_^y=4RoZg+S+FAs72X?$sO!@#V(}Q(%UsuVu3FcURHNn4U>Lympi&R-H zZ%EfYqAi`c|Anq|E~&HS{zI?d2Y=*P1J-5U7QZezhWJB0QkCjE><%6Gj_AN+1J7O3 zl}zr2M^7?2OS+?bXc@iBi8U>Ow^@gd?b3fIGlf-a5U=PNTJsuvDspBIeB05+K%d!- z!M0wLNm`}9TXeYwUnQO)eP6`JZ8BwZJta$1FTozO4)kWmnHApB3fTQw9eZ2WYr>;h zG4plaNsVqR%wc@(Fl$B6QQSp=a 0 then + begin + Priority := GetPriorityClass(Handle); + CloseHandle(Handle); + end else Priority := 0; + I := PriorityRadioGroup.Items.IndexOfObject(Pointer(Priority)); + if I = -1 then I := 1; + PriorityRadioGroup.ItemIndex := I; +end; + +procedure TChangePriorityDlg.FormCreate(Sender: TObject); +begin + with PriorityRadioGroup.Items do + begin + BeginUpdate; + AddObject('&Idle', Pointer(IDLE_PRIORITY_CLASS)); + AddObject('&Normal', Pointer(NORMAL_PRIORITY_CLASS)); + AddObject('&High', Pointer(HIGH_PRIORITY_CLASS)); + AddObject('&Realtime', Pointer(REALTIME_PRIORITY_CLASS)); + EndUpdate; + end; +end; + +procedure TChangePriorityDlg.OKBtnClick(Sender: TObject); +var + Handle: THandle; + Priority: DWORD; + Res: Boolean; +begin + with PriorityRadioGroup do Priority := DWORD(Items.Objects[ItemIndex]); + Handle := OpenProcess(PROCESS_ALL_ACCESS{PROCESS_SET_INFORMATION}, False, FProcessID); + if Handle <> 0 then + begin + Res := SetPriorityClass(Handle, Priority); + CloseHandle(Handle); + end else Res := False; + if Res then + ModalResult := mrOk + else + MessBox(sCantChange, MB_ICONERROR); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/Global.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/Global.dfm new file mode 100644 index 0000000..7933378 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/Global.dfm @@ -0,0 +1,1081 @@ +object GlobalModule: TGlobalModule + OldCreateOrder = False + OnCreate = DataModuleCreate + Left = 240 + Top = 203 + Height = 324 + Width = 481 + object ToolbarImagesList: TImageList + ShareImages = True + Left = 112 + Top = 8 + Bitmap = { + 494C01011A001D00040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000008000000001002000000000000080 + 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 + 000000000000000000000000000000000000FFFFFFFF00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + FF00FFFFFFFFFFFFFFFFFFFFFFF7F8EBC9CD72A0A7099DA4009DA4009DA4009D + A4009DA4009DA4009DA4009DA4009DA4009DA4009DA4009DA4009DA4009DA400 + 9DA4009DA4009DA400A3A90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000FF00000000000000 + 00000000000000000000000000000000000000FFFF0000FFFF0000FFFF000000 + 0000FFFFFF00000000000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FFFF0000FFFF00000000000000000000000000000000000000 + FF00000000000000FF007F7F7F00000000000000003F7F7F7F000000FF000000 + 00000000FF00000000000000000000000000000000BFBFBFBF007F7F7FBFFFFF + FF00000000000000000000FF0000008000000080000000000000000000BFFFFF + FF007F7F7F3F7F7F7F00000000000000000000000000000000000000003F7F7F + 7F00000000000000FF0000000000000000000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF00000000000000 + 000000000000000000000000000000000000000000BFBFBFBF000000000000FF + 00000000000000FF00000080000000FF000000800000008000000000000000FF + 00000000003F7F7F7F0000000000000000000000000000000000000000000000 + 00007F7F7F00000000000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000BFFFFFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FF000000FF000000FF000000FF000000800000000000BFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF000000000000FF + 0000000000BFFFFFFF0000FF000000FF00000080000000FF00000000000000FF + 0000000000BFBFBFBF0000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBFBFFFFFFF00000000BFFFFFFF000000000000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000BFBFBFBF00BFBFBF3F7F7F7F007F7F7F3F7F7F7F00000000000000 + 000000000000000000000000000000000000000000BFFFFFFF007F7F7FBFFFFF + FF000000000000000000FFFFFFBFFFFFFF0000FF000000000000000000BFFFFF + FF007F7F7FBFBFBFBF00000000000000000000000000000000000000003F7F7F + 7F0000000000000000000000FF000000FF0000000000000000000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF0000000000000000000000000000FF + FF0000FFFF000000000000000000000000000000000000000000000000BFBFBF + BF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F007F7F7F3F7F7F + 7F00000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF00000000000000000000000000000000000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF0000FFFF0000000000000000000000000000000000BFBFBFBFBFBF + BF00000000BFFFFFFF000000FFBFFFFFFF000000FFBFFFFFFF000000003F7F7F + 7F007F7F7F000000000000000000000000000000000000000000FFFFFFBFBFBF + BF00000000BFFFFFFF0000FF00BFFFFFFF0000FF00BFFFFFFF00000000BFBFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 000000000000000000000000000000FFFF0000FFFF0000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F000000000000000000000000000000000000000000000000BFFFFF + FF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F00BFBFBFBFBFBF + BF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF0000000000000000000000 + 000000000000000000000000000000FFFF000000000000000000000000000000 + 000000000000000000000000000000FFFF00000000BFBFBFBF007F7F7FBFFFFF + FF0000000000000000000000FF00000080000000800000000000000000BFFFFF + FF007F7F7F3F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00BFBFBFBFBFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000080000000000000000000FF + FF0000808000000000000000008000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000000000008000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 00000000008000000000000000800000000000000080000000000000000000FF + FF0000808000000000000000000000000000BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000080000000000000008000000000000000000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000800000000000000080000000007F7F7F3F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000008000000000000000800000 + 00000000008000000000000000000000000000000080000000000000000000FF + FF00008080000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000800000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 8000000000800000000000000080000000000000003F7F7F7F007F7F7F3F7F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFF00BFFFFF00000000008000000000000000000080 + 8000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000080000000000000000000000000000080000000 + 8000000080000000800000008000000080000000800000008000000000000000 + 8000000080000000000000000080000000000000FFBFFFFFFF000000003F7F7F + 7F007F7F7F00000000000000000000000000000000000000000000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF000000FF000000 + FF000000003F7F7F7F007F7F7F3F7F7F7F000000008000000000000000000000 + 00007F7F7FBFBFBFBF0000000000000000000000000000000000000000000000 + 00007F7F7F000000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000080000000800000000080000000000000000000000000FFFFFF000000 + 00007F7F7F0000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000FF0000000000000000000000000000000000000000007F7F7FBFBFBF + BF00BFBFBFBFBFBFBF00000000000000000000000000000000007F7F7F3F7F7F + 7F007F7F7F0000000000000000800000000000000000000000007F7F7F000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00000000000000800000008000000000000000003F7F7F7F00BFBFBFBFBFBF + BF007F7F7F3F7F7F7F00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF0000000000000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000008000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFF + FF00FFFFFF00000000000000800000000000BFBFBFBFBFBFBF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF0000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F0000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00000000BFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000008000000000000000000000 + 0000FFFFFFBFFFFFFF007F7F7F00000000000000000000000000000000BFBFBF + BF00BFBFBFBFFFFFFF0000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F0000000000000000000000FF00BFBFBF000000 + FF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000008000000000000000800000 + 00000000000000000000000000BFBFBFBF00BFBFBFBFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFFFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000080000000000000FF000000FF000000FFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F000000000000000080000000000000008000000000000000800000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF000000008000000000000000000000000000000000007F + 7F00007F7F00007F7F00007F7F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBF00000000007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F00000000800000000000000080000000000000008000000000000000800000 + 00000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00000000BFFFFFFF000000008000000000BFBFBF00BFBFBF0000000000007F + 7F0000FFFF00007F7F0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF00BFBFBF0000000000000000000000 + 0000000000800000000000000080000000000000008000000000000000800000 + 00000000000000000000FFFFFF00000000000000000000000000FFFFFFBFFFFF + FF000000000000000000000000800000000000000000000000000000000000FF + FF00007F7F0000FFFF00007F7F00000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000000000BFBFBFBF00BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF00BFBFBFBFBFBFBF000000003F7F7F7F00000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 00000000000000000000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF00000000800000000000000080000000007F7F7F007F7F7F000000000000FF + FF0000FFFF00007F7F0000FFFF000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 7F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00000000000000000000000000BFBFBFBFBFBF + BF00BFBFBFBFBFBFBF000000003F7F7F7F000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 00000000000000000000FFFFFFBFFFFFFF007F7F7F0000000000000000000000 + 0000000000800000000000000080000000007F7F7F007F7F7F000000000000FF + FF0000FFFF0000FFFF00007F7F0000000000000000000000000000007F000000 + 7F0000007F0000007F0000007F0000007F0000007F0000007F00000000000000 + 7F0000007F000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000008000000000000000000000 + 00000000003F7F7F7F0000000080000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 0000000000800000000000000000000000000000008000000000000000800000 + 00000000008000000000000000800000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000007F0000007F0000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF0000000000000000000000 + 000000000000000000000000000000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 00007F7F7F3F7F7F7F007F7F7F0000FFFF0000FFFF3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000BFBFBFBF00BFBFBF3F7F7F7F007F7F7F3F7F7F7F00000000000000 + 0000000000000000000000000000000000000000003F7F7F7F000000003F7F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000BFBFBF + BF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F007F7F7F3F7F7F + 7F000000000000000000000000000000000000000000000000000000FF000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBFBFBFBF + BF00000000BFFFFFFF0000FF00BFFFFFFF0000FF00BFFFFFFF000000003F7F7F + 7F007F7F7F000000000000000000000000000000003F7F7F7F00000000000000 + FF000000003F7F7F7F0000000000000000000000003F7F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F0000000000000000007F7F7F0000000000000000000000 + 00000000003F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F0000000000000000000000000000000000000000007F7F7F000000 + 00000000FF00000000007F7F7F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000BFFFFFFF000000000000000000000000BFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFBFBFBF007F7F7FBFFFFF + FF00000000000000000000FF0000008000000080000000000000000000BFFFFF + FF007F7F7F3F7F7F7F00000000000000000000000000000000000000003F7F7F + 7F00000000000000FF0000000000000000000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFBFBFBF000000000000FF + 00000000000000FF00000080000000FF000000800000008000000000000000FF + 00000000003F7F7F7F0000000000000000000000000000000000000000000000 + 00007F7F7F00000000000000FF000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000FFFF0000FFFF0000FFFF000000 + 0000FFFFFF00000000000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FFFF0000FFFF00000000000000003F7F7F7F00000000000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FF000000FF000000FF000000FF000000800000000000BFFFFF + FF000000003F7F7F7F0000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFF + FF000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF000000000000FF + 0000000000BFFFFFFF0000FF000000FF00000080000000FF00000000000000FF + 0000000000BFBFBFBF0000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000000000BFFFFFFF000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000003F7F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000BFFFFFFF007F7F7FBFFFFF + FF000000000000000000FFFFFFBFFFFFFF0000FF000000000000000000BFFFFF + FF007F7F7FBFBFBFBF00000000000000000000000000000000000000003F7F7F + 7F0000000000000000000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00000000BFFFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBFBFFFFFFF00000000BFFFFFFF000000000000FF + FF00000000000000000000000000000000000000000000000000000000000000 + FF007F7F7F0000000000000000000000000000000000000000000000003F7F7F + 7F000000FF000000000000000000000000000000000000000000FFFFFFBFBFBF + BF00000000BFFFFFFF0000FF00BFFFFFFF0000FF00BFFFFFFF00000000BFBFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFFBFFFFFFF00FFFFFFBFFFFFFF0000000000000000000000000000FF + FF0000FFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF00000000000000000000000000000000000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000BFFFFF + FF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F00BFBFBFBFBFBF + BF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF00000000000000000000000000000000000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF0000FFFF0000000000000000000000000000000000000000000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00BFBFBFBFBFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000FFFF0000FFFF000000 + 000000000000000000000000000000FFFF0000FFFF0000000000000000000000 + 00000000000000FFFF0000FFFF00000000000000000000000000000000000000 + FF00000000000000FF007F7F7F00000000000000003F7F7F7F000000FF000000 + 00000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000FFFF0000000000000000000000 + 000000000000000000000000000000FFFF000000000000000000000000000000 + 000000000000000000000000000000FFFF000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000000000 + 0000000000000000000000000080000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000008000000000000000800000 + 00000000008000000000000000000000000000000080000000000000000000FF + FF0000FFFF0000FFFF0000000080000000000000008000000000000000800000 + 0000000000000000000000000000000000000000000000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFF00BFFFFF0000FFFF000000000000000000000000 + 00007F7F7F3F7F7F7F007F7F7F00000000000000008000000000000000000000 + 0000000000BFBFBFBF00BFBFBF3F7F7F7F007F7F7F3F7F7F7F00000000000000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000BFBFBFBF00BFBFBF3F7F7F7F007F7F7F3F7F7F7F00000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF000000FF000000 + FF000000003F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F7F007F7F7F3F7F7F + 7F007F7F7F0000000000FFFFFF00000000000000008000000000000000BFBFBF + BF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F007F7F7F3F7F7F + 7F00000000800000000000000080000000000000000000000000000000BFBFBF + BF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F007F7F7F3F7F7F + 7F000000000000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000000000000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000BFBFBFBFBFBF + BF00000000BFFFFFFF0000FFFFBFFFFFFF0000FFFFBFFFFFFF000000003F7F7F + 7F007F7F7F000000000000000080000000000000000000000000BFBFBFBFBFBF + BF00000000BFFFFFFF000000FFBFFFFFFF000000FFBFFFFFFF000000003F7F7F + 7F007F7F7F0000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F000000000000000080000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 00007F7F7F0000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFBFBFBF007F7F7FBFFFFF + FF00000000000000000000FFFF00008080000080800000000000000000BFFFFF + FF007F7F7F3F7F7F7F000000008000000000000000BFBFBFBF007F7F7FBFFFFF + FF0000000000000000000000FF00000080000000800000000000000000BFFFFF + FF007F7F7F3F7F7F7F00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFBFBFBF000000000000FF + FF000000000000FFFF000080800000FFFF0000808000008080000000000000FF + FF000000003F7F7F7F000000008000000000000000BFBFBFBF00000000000000 + FF00000000000000FF00000080000000FF000000800000008000000000000000 + FF000000003F7F7F7F00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000BFFFFFFF007F7F7F3F7F7F + 7F00FFFFFF3F7F7F7F007F7F7FBFFFFFFF007F7F7FBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFFFFFFF00000000BFFFFF + FF000000000000FFFF0000FFFF0000FFFF0000FFFF0000808000000000BFFFFF + FF000000003F7F7F7F000000008000000000000000BFFFFFFF00000000BFFFFF + FF00000000000000FF000000FF000000FF000000FF0000008000000000BFFFFF + FF000000003F7F7F7F00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFFFFFFF000000000000FF + FF00000000BFFFFFFF0000FFFF0000FFFF000080800000FFFF000000000000FF + FF00000000BFBFBFBF000000008000000000000000BFFFFFFF00000000000000 + FF00000000BFFFFFFF000000FF000000FF00000080000000FF00000000000000 + FF00000000BFBFBFBF00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF000000000000000000FFFFFF00FFFF + FF0000000000FFFFFF000000000000000000000000BFFFFFFF007F7F7F3F7F7F + 7F00FFFFFF3F7F7F7F007F7F7F3F7F7F7F00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000000000BFFFFFFF007F7F7FBFFFFF + FF000000000000000000FFFFFFBFFFFFFF0000FFFF0000000000000000BFFFFF + FF007F7F7FBFBFBFBF000000008000000000000000BFFFFFFF007F7F7FBFFFFF + FF000000000000000000FFFFFFBFFFFFFF000000FF0000000000000000BFFFFF + FF007F7F7FBFBFBFBF00000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000BFFFFFFF00FFFFFFBFFFFF + FF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFFBFFFFFFF00FFFFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF000000000000000080000000000000000000000000BFBFBF000000 + 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000 + 0000BFBFBF0000000000000000000000000000000000FFFFFF0000000000FFFF + FF0000000000FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF000000 + 0000FFFFFF0000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF000000000000000080000000000000000000000000FFFFFFBFBFBF + BF00000000BFFFFFFF0000FFFFBFFFFFFF0000FFFFBFFFFFFF00000000BFBFBF + BF00BFBFBF000000000000000080000000000000000000000000FFFFFFBFBFBF + BF00000000BFFFFFFF000000FFBFFFFFFF000000FFBFFFFFFF00000000BFBFBF + BF00BFBFBF0000000000000000000000000000000000FFFFFF0000000000FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000080000000000000008000000000000000BFFFFF + FF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F00BFBFBFBFBFBF + BF00000000800000000000000080000000000000000000000000000000BFFFFF + FF00BFBFBF3F7F7F7F0000000000000000000000003F7F7F7F00BFBFBFBFBFBF + BF000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000007F7F7F00000000007F7F7F000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000800000000000000080000000000000008000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00BFBFBFBFBFBFBF00000000000000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000BFFFFFFF00FFFFFFBFFFFFFF00BFBFBFBFBFBFBF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000008000000000000000800000 + 0000000000800000000000000080000000000000008000000000000000800000 + 0000000000000000000000000080000000000000008000000000000000800000 + 0000000000000000000000000000000000000000000000000000000000800000 + 0000000000800000000000000080000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F000000000000000000000000000000000000000000007F + 7F00007F7F00007F7F00007F7F00000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF0000000000000000000000 + 00000000FF00000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F0000000000BFBFBF00BFBFBF00BFBFBF00BFBFBF0000000000007F + 7F0000FFFF00007F7F0000FFFF000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000FF000000FF00000000000000 + 7F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F00000000007F7F7F00BFBFBF007F7F7F00000000000000 + 00000000000000000000000000000000FF00000000000000000000FFFF000000 + 00007F7F7F007F7F7F00000000000000000000000000000000000000000000FF + FF00007F7F0000FFFF00007F7F0000000000000000000000000000007F000000 + 7F0000007F0000007F0000007F0000007F0000007F0000007F00000000000000 + 7F0000007F000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F007F7F7F0000000000BFBFBF00BFBFBF00BFBFBF00000000000000 + 000000000000000000000000FF0000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF00007F7F0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000007F0000007F0000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF000000000000FFFF000000000000FFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F007F7F7F0000000000BFBFBF00BFBFBF00BFBFBF00000000000000 + 0000000000000000FF000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF0000FFFF00007F7F000000000000000000000000007F7F7F000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF000000000000007F0000007F00000000000000000000000000000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F007F7F7F007F7F7F000000000000000000BFBFBF00BFBFBF00000000000000 + 00000000FF00000000000000000000000000000000000000000000FFFF000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF00000000000000000000007F00000000000000000000000000000000000000 + 000000FFFF000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000 + 000000000000000000000000000000000000000000007F7F7F0000000000BFBF + BF00BFBFBF00BFBFBF0000000000BFBFBF0000000000BFBFBF007F7F7F000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF007F7F7F0000000000000000000000000000000000FFFF + FF0000000000FFFFFF0000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF000000 + 000000000000000000000000000000000000000000007F7F7F00000000007F7F + 7F007F7F7F007F7F7F0000000000BFBFBF0000000000BFBFBF007F7F7F000000 + 00000000FF000000FF000000FF000000FF00000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF0000000000000000000000000000000000000000000000 + 000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000 + 00000000000000000000000000000000000000000000BFBFBF0000000000BFBF + BF00BFBFBF00BFBFBF0000000000BFBFBF0000000000BFBFBF007F7F7F000000 + 000000000000000000000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF007F7F7F0000000000000000000000 + 000000000000FFFFFF0000000000000000000000000000000000000000000000 + 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000 + 000000000000000000000000000000000000000000000000000000000000BFBF + BF00BFBFBF00BFBFBF000000000000000000BFBFBF00BFBFBF00000000000000 + 00000000FF00000000000000000000000000000000000000000000FFFF000000 + 00007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF00000000007F7F7F00BFBFBF00BFBFBF00000000000000 + 0000000000000000FF000000000000000000000000000000000000FFFF000000 + 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF000000000000FF + FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF00000000007F7F7F007F7F7F00BFBFBF00000000000000 + 000000000000000000000000FF00000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000007F + 7F0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BFBFBF007F7F7F007F7F7F007F7F7F007F7F7F00000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00007F7F0000FFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000BFBFBF00000000007F7F7F0000000000000000000000 + 00000000FF000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000007F + 7F0000FFFF00007F7F0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 + 00007F0000007F00000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F000000FF000000FF00 + 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00 + 0000FF0000007F00000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F0000007F0000007F00 + 0000BFBFBF00BFBFBF0000007F0000FFFF0000007F00BFBFBF00BFBFBF007F00 + 00007F0000007F00000000000000000000000000000000000000000000000000 + 000000000000000000000000000000FFFF007F7F7F00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF0000FFFF0000000000FFFF0000000000000000000000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF00BFBFBF0000007F00FFFFFF00FFFFFF007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F007F7F + 7F0000000000000000007F7F7F0000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF00BFBFBF0000FFFF00FFFFFF007F7F7F007F7F7F000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F007F7F7F0000FFFF0000000000FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FF000000FF000000FF00000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000BFBFBF00BFBFBF0000007F00FFFFFF007F7F7F00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 00007F7F7F0000FFFF0000FFFF0000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000FF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000BFBFBF0000FFFF007F7F7F0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF00000000000000000000000000FFFFFF0000000000000000000000 + 00000000FF0000000000000000007F7F7F00FFFF000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF + FF0000000000000000000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF000000000000000000FFFF00000000000000FFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F0000FFFF007F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000007F00FFFFFF0000007F0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF000000000000000000000000000000000000FF + FF00FFFFFF0000FFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000007F0000FFFF0000007F00FFFFFF0000007F00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF000000000000000000000000007F7F7F0000FFFF007F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF0000007F0000FFFF00FFFFFF0000FFFF007F7F7F000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BFBFBF00BFBFBF00BFBFBF00BFBFBF0000007F00FFFFFF007F7F7F000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F0000007F0000007F00 + 0000BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F000000FF000000FF00 + 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00 + 0000FF0000007F000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 + 00007F0000007F00000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FF000000FF000000FF000000FF000000FF000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00000000000000000000000000FFFFFF0000000000FFFF + FF000000000000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 000000000000000000000000000000000000FF000000FF000000FF000000FF00 + 0000FF000000FF000000BFBFBF0000000000BFBFBF00FF000000FF000000FF00 + 0000FF000000FF000000FF000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00BFBFBF00000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF00000000007F7F7F0000000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF000000000000000000000000000000000000000000000000000000 + 000000000000FFFFFF000000000000000000FFFFFF000000000000000000FFFF + FF000000000000000000FFFFFF00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 0000000000007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000007F7F + 7F007F7F7F0000000000FFFFFF007F7F7F00FFFFFF00000000007F7F7F007F7F + 7F0000000000FFFFFF0000000000000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000007F7F7F0000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000007F7F7F00000000000000000000000000000000000000 + 00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00000000000000 + 0000000000000000000000000000000000007F7F7F0000000000FFFFFF000000 + 00000000000000000000FFFFFF007F7F7F00FFFFFF0000000000000000000000 + 0000FFFFFF00000000007F7F7F00000000000000000000000000000000000000 + 0000FFFFFF0000FFFF000000000000000000FFFFFF0000000000FFFFFF000000 + 0000FFFFFF00FFFFFF00FFFFFF000000000000000000FF000000FF000000FF00 + 0000FF000000FF00000000000000000000000000000000000000000000000000 + 0000FFFFFF00FFFFFF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00000000000000000000000000000000000000000000000000FFFF + FF0000FFFF000000000000FFFF00FFFFFF0000000000FFFFFF0000FFFF000000 + 0000FFFFFF0000000000FFFFFF00000000000000000000000000FF000000FF00 + 0000FF0000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F000000000000000000000000007F7F7F0000000000FFFF + FF000000000000000000FFFFFF007F7F7F00FFFFFF000000000000000000FFFF + FF00000000007F7F7F0000000000000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000000000FFFFFF0000FFFF0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000000000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F0000000000000000007F7F7F0000000000FFFF + FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00000000007F7F7F000000000000000000000000000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000000000FFFFFF0000FFFF0000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 000000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000FFFFFF0000FF + FF00FFFFFF0000FFFF00FFFFFF0000FFFF0000000000FFFFFF00FFFFFF00FFFF + FF0000000000000000000000000000000000000000000000FF000000FF000000 + FF00000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000007F7F7F00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF00000000000000FFFF00FFFF + FF0000FFFF00FFFFFF0000FFFF00000000000000000000000000FFFFFF00FFFF + FF0000000000FFFFFF00FFFFFF0000000000000000000000FF000000FF000000 + FF0000000000000000007F7F7F0000FFFF007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F000000000000000000000000007F7F7F000000 + 000000000000000000007F7F7F00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF0000FFFF00000000000000FF + FF00FFFFFF0000FFFF000000000000FFFF00FFFFFF0000FFFF0000000000FFFF + FF0000000000FFFFFF000000000000000000000000000000FF000000FF000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000007F7F7F0000000000000000000000000000000000000000000000 + 0000000000007F7F7F0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF0000FFFF0000FFFF00000000 + 000000FFFF00FFFFFF0000FFFF00FFFFFF000000000000000000FFFFFF00FFFF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + 00007F7F7F007F7F7F0000000000000000000000000000000000000000000000 + 7F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF000000 + 0000BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 7F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF0000000000BFBFBF00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF00BFBFBF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF0000000000BFBFBF00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF000000FF000000FF00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF0000000000BFBFBF00000000007F7F7F000000 + 00000000000000000000000000000000000000000000000000000000FF000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00000000007F7F7F00000000007F7F7F000000 + 000000000000000000000000000000000000000000007F7F7F000000FF000000 + FF0000000000000000000000FF000000FF000000FF0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000BFBFBF0000000000FF000000FF000000FF00 + 00000000FF00FF000000FF000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF0000000000BFBFBF00000000007F7F7F000000 + 0000000000000000000000000000000000007F7F7F000000FF00000000000000 + 00000000000000000000000000000000FF000000FF0000000000000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000FFFFFF0000000000BFBFBF00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 00000000000000000000FFFFFF0000000000FFFFFF00000000000000FF000000 + FF000000FF000000FF000000FF00000000000000000000000000000000000000 + 7F0000007F0000007F0000FFFF000000000000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 00007F7F7F00000000007F7F7F00000000007F7F7F00000000007F7F7F000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000FF000000FF00000000000000 + 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF000000 + FF000000FF000000FF000000FF000000FF000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000FF000000FF000000 + 00000000000000000000000000000000000000000000FFFFFF00000000000000 + 0000FFFFFF000000000000000000000000000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F0000007F0000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF0000000000000000000000000000000000000000000000000000000000FFFF + FF00BFBFBF00BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F007F7F7F007F7F + 7F00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000007F7F7F000000 + FF000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF0000000000FFFFFF00FFFFFF000000000000000000000000000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F00FFFF000000007F000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000007F7F + 7F000000FF0000000000000000000000000000000000FFFFFF0000000000BFBF + BF00FFFFFF0000000000FFFFFF000000000000000000000000007F7F7F000000 + FF000000FF000000FF0000000000000000000000000000000000000000000000 + 7F00FFFF0000FFFF00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FF + FF00000000000000000000000000000000000000000000000000000000000000 + 000000000000000000007F7F7F007F7F7F007F7F7F0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000000000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF000000000000000000000000000000FF000000FF000000FF000000 + FF000000FF000000000000000000000000000000004000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000800000000100010000000000000400000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000FFFF0000FFFF0000FFFF0000FFFF00 + 0000000000FFFF0000007F0000007F000000000000007F000000000000000000 + FFFFFF40FFFFFF40FFFFFF40FFFFFF4000000040FFFFFF400000FF400000FF40 + FFFFFF400000FF40FFFFFF40FFFFFF40C380FFFFFFFFFF40C300E01FFFFFFF40 + C201C00F00000000C003800700000000C003000300000000C00300010000FF00 + 00038000000000000003C000000000000003E000000000000003F00000000000 + 0003F801000000000007F80100000000000FF80100000000003FF80700000000 + 80FFF80700000000C3FFFC7F00000000FFFFFFFFFF7EFFFFF83FFFFF9001FFFF + E00F8FFFC0032020C00787FFE0037271800383BFE00303038003C13FE003A723 + 0001E03FE003A7A70001F01F000187870001F81F8000CF8F0001F00FE007CFCF + 0001E00FE00FFFFF8003FC07E00FE7E78003FF07E027E3C7C007FFC3C073E7E7 + E00FFFF39E79E997F83FFFFF7EFEFC3FFC00FFE3FFFFFFFFF000FC41F83FF83F + C0008800E00FE00F00000000C007C00700000000800380030000000080038003 + 0000000000010001000000000001000100000000000100010000000000010001 + 000100000001000100030000800380030007000180038003001F0001C007C007 + 007F000DE00FE00F01FFD553F83FF83FFFFFFDFFFFFF8FC0E01FF8FFFC7B8000 + C00FF8FFF83780008007F87FF03E00000003F81FE01D80000001F80FE01B8000 + 8000F00F80178000C000E00F001F8A80E000E00F00108A80F000E00F001F8A80 + F801F01F80178000FC01F00FE01B8A80FE01F00FE01D8FC0FF1FF007F03EFFC0 + FFFFF007F837FFC0FFFFF007FC7BFFC0FFFFFC00FFFFFFFF8003FC00FFF8F83F + 8003FC0020F8E7CF8003FC00007FDFF7E00F0000007CB01BE00F0000003CB83B + F01F0000000F7C7DF83F000000047E8DFC7F0023000C4105F83F000101FF4105 + F01F0000E3FC4105E00F0023FFFC818BE00F0063FFFF81FB800300C3FFF8DFF7 + 80030107FFF8E7CF800303FFFFFFF83FFE7FFC7FFFFFF000FE1FF83FFFFFF000 + FC07F01FF83FF000FC01F01F0001F000F800F01F0001F000F800F01F0001F000 + 0000F01F0001F0000000F01F0001E0000001F83F8003C0000032FEC380038000 + 003EFEB980038000003EFF7DC1070000003EFF3DE38F0000001DFC99FFFF0001 + 0023F9C3FFFF0003003FF3FFFFFF0007C007E00FFFFFFF00C007E00FFFFFFF00 + C007E00FF9FFFF00C007E00FF0FFFF00C007E00FF0FF0000C007E00FE07F0000 + C007E00FC07F0000C007A00B843F0000C007C0071E3F0023C007E00FFE1F0001 + C007E00FFF1F0000C007C007FF8F0023C007C007FFC70063C007C007FFE300C3 + C007F83FFFF80107C007F83FFFFF03FF} + end + object SaveDialog: TSaveDialog + DefaultExt = 'txt' + Filter = 'Text file (*.txt)|*.txt' + Left = 24 + Top = 8 + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/Global.pas b/official/1.100/examples/windows/delphitools/toolhelpview/Global.pas new file mode 100644 index 0000000..2495496 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/Global.pas @@ -0,0 +1,132 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is Global.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit Global; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ImgList; + +type + TGlobalModule = class(TDataModule) + ToolbarImagesList: TImageList; + SaveDialog: TSaveDialog; + procedure DataModuleCreate(Sender: TObject); + private + FPeViewer: Variant; + FPeViewerRegistred: Boolean; + public + function ExecuteSaveDialog(var FileName: TFileName): Boolean; + procedure ListViewToClipboard(ListView: TListView); + procedure ListViewToFile(ListView: TListView; const FileName: TFileName); + procedure ViewPE(const FileName: TFileName); + property PeViewerRegistred: Boolean read FPeViewerRegistred; + end; + +var + GlobalModule: TGlobalModule; + +implementation + +{$R *.DFM} + +uses + ClipBrd, ToolsUtils, JclSysInfo; + +resourcestring + sWrongWindowsVersion = 'This application is intended for Windows 95/98/2000 only'; + +procedure CheckWindowsVersion; +begin + if IsWinNT4 then + begin + MessageBox(0, PChar(sWrongWindowsVersion), nil, MB_OK or MB_ICONERROR); + Halt(0); + end; +end; + +{ TGlobalModule } + +procedure TGlobalModule.ListViewToClipboard(ListView: TListView); +var + S: TStringList; +begin + S := TStringList.Create; + Screen.Cursor := crHourGlass; + try + ListViewToStrings(ListView, S, ListView.MultiSelect); + Clipboard.AsText := S.Text; + finally + S.Free; + Screen.Cursor := crDefault; + end; +end; + +procedure TGlobalModule.ListViewToFile(ListView: TListView; const FileName: TFileName); +var + S: TStringList; +begin + SaveDialog.FileName := ChangeFileExt(FileName, ''); + if SaveDialog.Execute then + begin + S := TStringList.Create; + Screen.Cursor := crHourGlass; + try + ListViewToStrings(ListView, S, ListView.MultiSelect); + S.SaveToFile(SaveDialog.FileName); + finally + S.Free; + Screen.Cursor := crDefault; + end; + end; +end; + +function TGlobalModule.ExecuteSaveDialog(var FileName: TFileName): Boolean; +begin + SaveDialog.FileName := ChangeFileExt(FileName, ''); + Result := SaveDialog.Execute; + if Result then FileName := SaveDialog.FileName; +end; + +procedure TGlobalModule.DataModuleCreate(Sender: TObject); +begin + FPeViewerRegistred := IsPeViewerRegistred; +end; + +procedure TGlobalModule.ViewPE(const FileName: TFileName); +begin + FPeViewer := CreateOrGetOleObject(PeViewerClassName); + FPeViewer.OpenFile(FileName); + FPeViewer.BringToFront; +end; + +initialization + CheckWindowsVersion; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.dfm new file mode 100644 index 0000000..8707fd7 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.dfm @@ -0,0 +1,235 @@ +inherited HeapDumpForm: THeapDumpForm + Left = 239 + Top = 152 + Width = 482 + Height = 380 + Caption = 'HeapDumpForm' + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + object Splitter2: TSplitter [0] + Left = 0 + Top = 281 + Width = 474 + Height = 3 + Cursor = crVSplit + Align = alBottom + AutoSnap = False + ResizeStyle = rsUpdate + end + object StatusBar: TStatusBar [1] + Left = 0 + Top = 334 + Width = 474 + Height = 19 + Panels = < + item + Width = 90 + end + item + Width = 90 + end + item + Width = 90 + end + item + Width = 90 + end> + SimplePanel = False + OnResize = StatusBarResize + end + object Panel1: TPanel [2] + Left = 0 + Top = 26 + Width = 474 + Height = 255 + Align = alClient + BevelOuter = bvNone + FullRepaint = False + TabOrder = 1 + object Splitter1: TSplitter + Left = 137 + Top = 0 + Width = 3 + Height = 255 + Cursor = crHSplit + AutoSnap = False + ResizeStyle = rsUpdate + end + object HeapListView: TListView + Tag = 1 + Left = 0 + Top = 0 + Width = 137 + Height = 255 + Align = alLeft + AllocBy = 16 + Columns = < + item + Caption = 'HID' + Width = 70 + end + item + Caption = 'Flags' + Width = 60 + end> + HideSelection = False + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = HeapListViewColumnClick + OnCompare = HeapListViewCompare + OnSelectItem = HeapListViewSelectItem + end + object HeapEntryListView: TListView + Left = 140 + Top = 0 + Width = 334 + Height = 255 + Align = alClient + AllocBy = 128 + Columns = < + item + Caption = 'Handle' + Width = 70 + end + item + Caption = 'Start Adress' + Width = 70 + end + item + Alignment = taRightJustify + Caption = 'BlockSize' + Width = 70 + end + item + Caption = 'End Adress' + Width = 70 + end + item + Caption = 'Flags' + Width = 65 + end + item + Alignment = taRightJustify + Caption = 'Lock Count' + Width = 70 + end> + ColumnClick = False + HideSelection = False + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + TabOrder = 1 + ViewStyle = vsReport + OnData = HeapEntryListViewData + OnSelectItem = HeapEntryListViewSelectItem + end + end + object HeapEntryMemo: TMemo [3] + Left = 0 + Top = 284 + Width = 474 + Height = 50 + Align = alBottom + PopupMenu = PopupMenu + ReadOnly = True + ScrollBars = ssVertical + TabOrder = 2 + end + inherited CoolBar: TCoolBar + Width = 474 + Bands = < + item + Control = ToolBar + ImageIndex = -1 + MinHeight = 22 + Width = 470 + end> + inherited ToolBar: TToolBar + Width = 457 + object ToolButton5: TToolButton + Left = 0 + Top = 0 + Action = Refresh1 + end + object ToolButton6: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton6' + ImageIndex = 1 + Style = tbsSeparator + end + object ToolButton7: TToolButton + Left = 31 + Top = 0 + Action = Copy1 + end + object ToolButton8: TToolButton + Left = 54 + Top = 0 + Action = SaveToFile1 + end + object ToolButton3: TToolButton + Left = 77 + Top = 0 + Action = Find1 + end + object ToolButton1: TToolButton + Left = 100 + Top = 0 + Width = 8 + Caption = 'ToolButton1' + ImageIndex = 4 + Style = tbsSeparator + end + object ToolButton2: TToolButton + Left = 108 + Top = 0 + Action = SelectAll1 + end + end + end + inherited ActionList: TActionList + Top = 296 + inherited Refresh1: TAction + OnExecute = Refresh1Execute + end + end + inherited PopupMenu: TPopupMenu + Top = 296 + object Refresh2: TMenuItem + Caption = 'Refresh' + Hint = 'Refresh HeapList' + ImageIndex = 2 + ShortCut = 116 + OnClick = Refresh1Execute + end + object N1: TMenuItem + Caption = '-' + end + object Copy2: TMenuItem + Caption = 'Copy' + Hint = 'Copy to clipboard' + ImageIndex = 9 + ShortCut = 16451 + end + object Save1: TMenuItem + Caption = 'Save' + Hint = 'Save to text file' + ImageIndex = 3 + ShortCut = 16467 + end + object N2: TMenuItem + Caption = '-' + end + object Selectall2: TMenuItem + Action = SelectAll1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.pas b/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.pas new file mode 100644 index 0000000..88f6be3 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/HeapDump.pas @@ -0,0 +1,334 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is HeadDump.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit HeapDump; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ExtCtrls, StdCtrls, ToolWin, ActnList, ClipBrd, Menus, + TLHelp32, ViewTemplate; + +type + THeapDumpForm = class(TViewForm) + StatusBar: TStatusBar; + Panel1: TPanel; + HeapListView: TListView; + Splitter1: TSplitter; + HeapEntryListView: TListView; + Splitter2: TSplitter; + HeapEntryMemo: TMemo; + ToolButton5: TToolButton; + ToolButton6: TToolButton; + ToolButton7: TToolButton; + ToolButton8: TToolButton; + Refresh2: TMenuItem; + N1: TMenuItem; + Copy2: TMenuItem; + Save1: TMenuItem; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + N2: TMenuItem; + Selectall2: TMenuItem; + ToolButton3: TToolButton; + procedure HeapListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure HeapListViewCompare(Sender: TObject; Item1, Item2: TListItem; + Data: Integer; var Compare: Integer); + procedure StatusBarResize(Sender: TObject); + procedure Refresh1Execute(Sender: TObject); + procedure HeapEntryListViewData(Sender: TObject; Item: TListItem); + procedure HeapEntryListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure HeapListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + private + FProcessID: DWORD; + FFileName: TFileName; + FreeSum, FixedSum, MoveableSum: Integer; + FHeapEntries: array of THeapEntry32; + procedure BuildHeapList; + procedure BuildHeapEntriesList(HeapID: DWORD); + procedure UpdateStatusLine; + procedure ReadHeapEntry(Item: TListItem); + public + procedure BuildContent; override; + procedure SetParams(ProcessID: DWORD; const FileName: TFileName); + end; + +var + HeapDumpForm: THeapDumpForm; + +implementation + +{$R *.DFM} + +uses + Global, Main, ToolsUtils; + +resourcestring + sCaption = 'HeapList - %s'; + sCountStatus = 'Heap Entries: %d'; + sFixedStatus = 'Fixed: %0.n'; + sFreeStatus = 'Free: %0.n'; + sMoveableStatus = 'Moveable: %0.n'; + sPressEscape = 'Press to cancel enumerating heap items ...'; + +{ THeapDumpForm } + +procedure THeapDumpForm.BuildHeapEntriesList(HeapID: DWORD); +var + Next: Boolean; + HeapEntry: THeapEntry32; + EntriesCount: Integer; +begin + with HeapEntryListView do + begin + Items.BeginUpdate; + Screen.Cursor := crHourGlass; + try + HeapEntryMemo.Font.Style := [fsBold]; + HeapEntryMemo.Text := sPressEscape; + Items.Count := 0; + EntriesCount := 0; + SetLength(FHeapEntries, 0); + FreeSum := 0; + FixedSum := 0; + MoveableSum := 0; + HeapEntry.dwSize := Sizeof(HeapEntry); + Next := Heap32First(HeapEntry, FProcessID, HeapID); + while Next do + begin + SetLength(FHeapEntries, EntriesCount + 1); + FHeapEntries[EntriesCount] := HeapEntry; + with HeapEntry do + case dwFlags of + LF32_FIXED: + Inc(FixedSum, dwBlockSize); + LF32_FREE: + Inc(FreeSum, dwBlockSize); + LF32_MOVEABLE: + Inc(MoveableSum, dwBlockSize); + end; + Inc(EntriesCount); + if EntriesCount mod 200 = 0 then + begin + UpdateStatusLine; + if GetAsyncKeyState(VK_ESCAPE) and $8000 <> 0 then Break; + end; + Next := Heap32Next(HeapEntry); + end; + Items.Count := EntriesCount; + if Items.Count > 0 then + begin + AlphaSort; + ItemFocused := Items[0]; + ItemFocused.Selected := True; + end; + UpdateStatusLine; + HeapEntryMemo.ParentFont := True; + finally + Items.EndUpdate; + Screen.Cursor := crDefault; + end; + end; +end; + +procedure THeapDumpForm.BuildHeapList; +var + SnapProcHandle: THandle; + HeapList: THeapList32; + Next: Boolean; +begin + with HeapListView do + begin + Items.BeginUpdate; + try + Items.Clear; + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, FProcessID); + if SnapProcHandle <> THandle(-1) then + begin + HeapList.dwSize := Sizeof(HeapList); + Next := Heap32ListFirst(SnapProcHandle, HeapList); + while Next do + begin + with Items.Add do + begin + Caption := Format('%.8x', [HeapList.th32HeapID]); + Data := Pointer(HeapList.th32HeapID); + case HeapList.dwFlags of + HF32_DEFAULT: + SubItems.Add('Default'); + HF32_SHARED: + SubItems.Add('Shared'); + else + SubItems.Add('Normal'); + end; + end; + Next := Heap32ListNext(SnapProcHandle, HeapList); + end; + CloseHandle(SnapProcHandle); + end; + if Items.Count > 0 then + begin + AlphaSort; + ItemFocused := Items[0]; + ItemFocused.Selected := True; + end else + begin + BuildHeapEntriesList(0); + HeapEntryMemo.Lines.Clear; + end; + finally + Items.EndUpdate; + end; + end; +end; + +procedure THeapDumpForm.SetParams(ProcessID: DWORD; const FileName: TFileName); +begin + FProcessID := ProcessID; + FFileName := FileName; + Caption := Format(sCaption, [FFileName]); + PostBuildContentMessage; +end; + +procedure THeapDumpForm.HeapListViewColumnClick(Sender: TObject; + Column: TListColumn); +begin + LVColumnClick(Column); +end; + +procedure THeapDumpForm.HeapListViewCompare(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); +begin + LVCompare(TListView(Sender), Item1, Item2, Compare); +end; + +procedure THeapDumpForm.UpdateStatusLine; +begin + with StatusBar.Panels do + begin + BeginUpdate; + Items[0].Text := Format(sCountStatus, [High(FHeapEntries) + 1]); + Items[1].Text := Format(sFixedStatus, [IntToExtended(FixedSum)]); + Items[2].Text := Format(sMoveableStatus, [IntToExtended(MoveableSum)]); + Items[3].Text := Format(sFreeStatus, [IntToExtended(FreeSum)]); + EndUpdate; + Update; + end; +end; + +procedure THeapDumpForm.StatusBarResize(Sender: TObject); +var + I: Integer; +begin + with StatusBar do + for I := 0 to Panels.Count - 1 do Panels[I].Width := Width div 4; +end; + +procedure THeapDumpForm.ReadHeapEntry(Item: TListItem); +var + BlockSize, BytesRead: DWORD; + Buffer, BufferEnd, P: PChar; +begin + with HeapEntryMemo do {if DWORD(Item.SubItems.Objects[2]) <> LF32_FREE then} + begin + BlockSize := DWORD(Item.SubItems.Objects[1]); + if BlockSize > 32768 then BlockSize := 32768; + GetMem(Buffer, BlockSize); + Lines.BeginUpdate; + try + Lines.Clear; + if Toolhelp32ReadProcessMemory(FProcessID, Item.SubItems.Objects[0], + Buffer^, BlockSize - 1, BytesRead) then + begin + P := Buffer; + BufferEnd := Buffer + BytesRead - 1; + while P < BufferEnd do + begin + case P^ of + #0: P^ := '|'; + #1..#31: P^ := '.'; + end; + Inc(P); + end; + Buffer[BytesRead] := #0; + SetTextBuf(Buffer); + end; + finally + FreeMem(Buffer); + Lines.EndUpdate; + end; + end; +end; + +procedure THeapDumpForm.Refresh1Execute(Sender: TObject); +begin + BuildHeapList; +end; + +procedure THeapDumpForm.HeapEntryListViewData(Sender: TObject; + Item: TListItem); +begin + with Item, FHeapEntries[Item.Index] do + begin + Caption := Format('%.8x', [hHandle]); + SubItems.AddObject(Format('%.8x', [dwAddress]), Pointer(dwAddress)); + SubItems.AddObject(Format('%.0n', [IntToExtended(dwBlockSize)]), Pointer(dwBlockSize)); + SubItems.AddObject(Format('%.8x', [dwAddress + dwBlockSize]), Pointer(dwAddress + dwBlockSize)); + case dwFlags of + LF32_FIXED: + SubItems.AddObject('Fixed', Pointer(dwFlags)); + LF32_FREE: + SubItems.AddObject('Free', Pointer(dwFlags)); + LF32_MOVEABLE: + SubItems.AddObject('Moveable', Pointer(dwFlags)); + end; + SubItems.AddObject(Format('%d', [dwLockCount]), Pointer(dwLockCount)); + end; +end; + +procedure THeapDumpForm.HeapEntryListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected then ReadHeapEntry(Item); +end; + +procedure THeapDumpForm.HeapListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected then BuildHeapEntriesList(DWORD(Item.Data)); +end; + +procedure THeapDumpForm.BuildContent; +begin + BuildHeapList; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/Main.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/Main.dfm new file mode 100644 index 0000000..02526b3 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/Main.dfm @@ -0,0 +1,876 @@ +object MainForm: TMainForm + Left = 191 + Top = 107 + ActiveControl = ProcessListView + AutoScroll = False + Caption = 'ToolHelp Viewer' + ClientHeight = 404 + ClientWidth = 587 + Color = clBtnFace + Constraints.MinHeight = 300 + Constraints.MinWidth = 400 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu + OldCreateOrder = False + Position = poDefault + ShowHint = True + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 234 + Width = 587 + Height = 3 + Cursor = crVSplit + Align = alBottom + MinSize = 70 + ResizeStyle = rsUpdate + end + object ProcessListView: TListView + Left = 0 + Top = 26 + Width = 587 + Height = 208 + Align = alClient + AllocBy = 32 + Columns = < + item + Caption = 'Process' + Width = 110 + end + item + Caption = 'PID' + MaxWidth = 65 + Width = 65 + end + item + Alignment = taRightJustify + Caption = 'Priority' + MaxWidth = 50 + end + item + Alignment = taRightJustify + Caption = 'Threads' + MaxWidth = 51 + Width = 51 + end + item + Caption = 'ExeType' + MaxWidth = 55 + Width = 55 + end + item + Caption = 'FileName' + Width = 250 + end + item + Caption = 'Parent Process' + Width = 90 + end> + GridLines = True + HideSelection = False + HotTrackStyles = [] + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + StateImages = PriorityImagesList + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = ProcessListViewColumnClick + OnCompare = ProcessListViewCompare + OnDblClick = ProcessListViewDblClick + OnEnter = ProcessListViewEnter + OnSelectItem = ProcessListViewSelectItem + end + object StatusBar: TStatusBar + Left = 0 + Top = 385 + Width = 587 + Height = 19 + Panels = < + item + Width = 85 + end + item + Width = 400 + end + item + Width = 165 + end> + SimplePanel = False + OnResize = StatusBarResize + end + object BottomPanel: TPanel + Left = 0 + Top = 237 + Width = 587 + Height = 148 + Align = alBottom + BevelOuter = bvNone + FullRepaint = False + TabOrder = 2 + object Splitter2: TSplitter + Left = 470 + Top = 0 + Width = 3 + Height = 148 + Cursor = crHSplit + Align = alRight + MinSize = 70 + ResizeStyle = rsUpdate + end + object ModulesListView: TListView + Left = 0 + Top = 0 + Width = 470 + Height = 148 + Align = alClient + AllocBy = 32 + Columns = < + item + Caption = 'Module' + Width = 70 + end + item + Caption = 'MID' + MaxWidth = 65 + Width = 65 + end + item + Caption = 'ImageBase' + Width = 70 + end + item + Caption = 'Base' + Width = 70 + end + item + Alignment = taRightJustify + Caption = 'Size' + MaxWidth = 80 + Width = 70 + end + item + Alignment = taRightJustify + Caption = 'Global #' + MaxWidth = 55 + Width = 55 + end + item + Alignment = taRightJustify + Caption = 'Process #' + MaxWidth = 60 + Width = 60 + end + item + Caption = 'Handle' + MaxWidth = 70 + Width = 70 + end + item + Caption = 'FileName' + Width = 200 + end> + HotTrackStyles = [] + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + TabOrder = 0 + ViewStyle = vsReport + OnColumnClick = ProcessListViewColumnClick + OnCompare = ProcessListViewCompare + OnCustomDrawItem = ModulesListViewCustomDrawItem + OnDblClick = ProcessListViewDblClick + OnEnter = ProcessListViewEnter + OnSelectItem = ModulesListViewSelectItem + end + object ThreadsListView: TListView + Left = 473 + Top = 0 + Width = 114 + Height = 148 + Align = alRight + AllocBy = 4 + Columns = < + item + Caption = 'TID' + Width = 65 + end + item + Caption = 'Priority' + Width = 45 + end> + HotTrackStyles = [] + ReadOnly = True + RowSelect = True + TabOrder = 1 + ViewStyle = vsReport + OnColumnClick = ProcessListViewColumnClick + OnCompare = ProcessListViewCompare + OnEnter = ProcessListViewEnter + end + end + object CoolBar1: TCoolBar + Left = 0 + Top = 0 + Width = 587 + Height = 26 + AutoSize = True + BandMaximize = bmNone + Bands = < + item + Control = ToolBar1 + ImageIndex = -1 + MinHeight = 22 + Width = 583 + end> + FixedSize = True + OnResize = CoolBar1Resize + object ToolBar1: TToolBar + Left = 9 + Top = 0 + Width = 570 + Height = 22 + AutoSize = True + Caption = 'ToolBar1' + EdgeBorders = [] + Flat = True + Images = GlobalModule.ToolbarImagesList + TabOrder = 0 + Wrapable = False + object RefreshButton: TToolButton + Left = 0 + Top = 0 + Action = Refresh1 + end + object ToolButton7: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton7' + ImageIndex = 6 + Style = tbsSeparator + end + object CopyButton: TToolButton + Left = 31 + Top = 0 + Action = Copy1 + end + object SaveButton: TToolButton + Left = 54 + Top = 0 + Action = SaveToFile1 + end + object ToolButton3: TToolButton + Left = 77 + Top = 0 + Width = 8 + Caption = 'ToolButton3' + ImageIndex = 5 + Style = tbsSeparator + end + object ToolButton1: TToolButton + Left = 85 + Top = 0 + Action = DumpHeap1 + end + object ToolButton2: TToolButton + Left = 108 + Top = 0 + Action = DumpMemory1 + end + object ToolButton6: TToolButton + Left = 131 + Top = 0 + Action = DumpModules1 + end + object ToolButton10: TToolButton + Left = 154 + Top = 0 + Action = DumpPE1 + end + object ToolButton4: TToolButton + Left = 177 + Top = 0 + Width = 8 + Caption = 'ToolButton4' + ImageIndex = 5 + Style = tbsSeparator + end + object ChangePriButton: TToolButton + Left = 185 + Top = 0 + Action = ChangePriority1 + end + object KillButton: TToolButton + Left = 208 + Top = 0 + Action = Terminate1 + end + object PropertyButton: TToolButton + Left = 231 + Top = 0 + Action = FileProperties1 + end + object ToolButton5: TToolButton + Left = 254 + Top = 0 + Width = 8 + Caption = 'ToolButton5' + ImageIndex = 5 + Style = tbsSeparator + end + object HottrackButton: TToolButton + Left = 262 + Top = 0 + Action = HotTrack1 + Style = tbsCheck + end + object ToolButton8: TToolButton + Left = 285 + Top = 0 + Action = InfoTip1 + Style = tbsCheck + end + object ToolButton9: TToolButton + Left = 308 + Top = 0 + Action = BeepOnChange1 + Style = tbsCheck + end + object ToolButton11: TToolButton + Left = 331 + Top = 0 + Action = CheckImageBase1 + Style = tbsCheck + end + end + end + object PriorityImagesList: TImageList + Left = 104 + Top = 312 + Bitmap = { + 494C010103000500040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000002000000001002000000000000020 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F0000007F00 + 0000BFBFBF00BFBFBF007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF0000007F0000007F0000007F00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF0000007F0000007F0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF0000007F0000007F0000007F00BFBFBF000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF0000007F0000007F0000007F00BFBFBF00BFBFBF00BFBFBF007F0000007F00 + 0000BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000 + 7F0000007F0000007F0000007F0000007F007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF000000 + 7F0000007F0000007F0000007F0000007F00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000 + 7F0000007F0000007F0000007F0000007F0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000BFBFBF00BFBFBF00BFBFBF000000 + 7F0000007F0000007F0000007F0000007F00BFBFBF00BFBFBF007F0000007F00 + 00007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F0000007F00 + 0000BFBFBF00BFBFBF007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000007F0000007F0000007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00BFBFBF00FFFF + FF00BFBFBF00FFFFFF00BFBFBF00BFBFBF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF000000000000FFFF00FFFFFF007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000BFBFBF00FFFFFF000000 + 7F00FFFFFF0000007F0000007F00BFBFBF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF0000FFFF007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00BFBFBF000000 + 7F00BFBFBF0000007F00BFBFBF00FFFFFF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF000000000000000000000000000000000000FFFF00FFFFFF007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000BFBFBF0000007F000000 + 7F00FFFFFF00BFBFBF0000007F00BFBFBF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF0000000000FFFFFF000000000000FFFF00FFFFFF0000FFFF007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F0000007F00 + 0000BFBFBF00BFBFBF007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000FFFFFF00BFBFBF000000 + 7F00BFBFBF0000007F0000007F00FFFFFF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF0000000000FFFFFF00FFFFFF00FFFF + FF00000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F0000007F00 + 0000BFBFBF00BFBFBF007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F000000BFBFBF00FFFFFF00BFBF + BF00FFFFFF00BFBFBF00FFFFFF00BFBFBF007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF000000000000000000000000000000 + 00000000000000FFFF00FFFFFF007F0000007F0000007F0000007F000000BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF007F000000FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 000000FFFF00FFFFFF0000FFFF007F00000000FFFF007F000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF007F000000FFFFFF00FFFFFF007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F00000000000000BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 0000FFFFFF0000FFFF00FFFFFF007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF007F00 + 00007F0000007F0000007F0000007F000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF0000007F00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 0000000000000000000000000000000000007F000000BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 0000000000000000000000000000000000007F000000BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000000000 + 0000000000000000000000000000000000007F000000BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF0000FFFF00FFFFFF00FFFFFF00FFFFFF0000FFFF0000FFFF000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000FFFF000000 + 0000000000000000000000000000000000007F000000BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 00000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF00FFFFFF00FFFFFF00000000007F7F7F007F7F7F0000FFFF000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000FF000000FF000000FF000000FF000000FF00000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF0000FFFF000000 + 0000000000000000000000000000000000007F000000BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000FFFF0000FFFF00FFFFFF007F7F7F00FFFFFF0000FFFF0000FFFF000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000FF000000FF000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FFFF0000FFFF007F7F7F0000FFFF0000FFFF00000000000000 + 0000000000000000000000000000000000007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 + 00007F0000007F0000007F0000007F0000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF000000 + 0000000000000000000000000000BFBFBF00000000000000000000000000BFBF + BF00000000000000000000000000BFBFBF000000000000000000000000000000 + 00000000000000000000000000000000FF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000FFFF0000FFFF0000FFFF0000000000000000000000 + 000000000000000000000000000000000000BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00BFBF + BF00BFBFBF00BFBFBF00BFBFBF00BFBFBF00424D3E000000000000003E000000 + 2800000040000000200000000100010000000000000100000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000FF000000000000FF0000FF0000FF + 000000000000FF0000FFBFBFBF00000000FF0000FFFFFF00FF0000FF0000FF00 + 000000000000000000000000FF0000FFFEFFFC7FF83F0000FEFFFC7FF83FBFBF + FC7FFC7FF83FFFFFFC7FFC7FF83F0000F83FFC7FF01F0000F83FFC7FE00F0000 + F01FE00FE00FBFBFF01FE00FC007FFFFE00FF01FC00B0000E00FF01FC00700FF + FC7FF83FE00FFF00FC7FF83FE00F0000FC7FFC7FF01FFF00FC7FFC7FF83FFF00 + FC7FFEFFF83F0000FC7FFEFFF83F00FF00000000000000000000000000000000 + 000000000000} + end + object MainMenu: TMainMenu + Images = GlobalModule.ToolbarImagesList + Left = 8 + Top = 312 + object File1: TMenuItem + Caption = '&File' + object CopyItem: TMenuItem + Action = Copy1 + end + object SaveItem: TMenuItem + Action = SaveToFile1 + end + object N2: TMenuItem + Caption = '-' + end + object ExitItem: TMenuItem + Action = Exit1 + end + end + object Tools1: TMenuItem + Caption = '&Tools' + object RefreshItem: TMenuItem + Action = Refresh1 + end + object N1: TMenuItem + Caption = '-' + end + object ChangePriorityItem: TMenuItem + Action = ChangePriority1 + end + object DumpHeapItem: TMenuItem + Action = DumpHeap1 + end + object DumpMemory11: TMenuItem + Action = DumpMemory1 + end + object Moduleslist1: TMenuItem + Action = DumpModules1 + end + object DumpPEfile1: TMenuItem + Action = DumpPE1 + end + object N4: TMenuItem + Caption = '-' + end + object FilePropItem: TMenuItem + Action = FileProperties1 + end + object TerminateItem: TMenuItem + Action = Terminate1 + end + end + object Options1: TMenuItem + Caption = '&Options' + object Beeponchange2: TMenuItem + Action = BeepOnChange1 + end + object CheckImageBase2: TMenuItem + Action = CheckImageBase1 + end + object HotTrackItem: TMenuItem + Action = HotTrack1 + end + object InfoTip2: TMenuItem + Action = InfoTip1 + end + end + object Views1: TMenuItem + Caption = '&Views' + Visible = False + end + object Help1: TMenuItem + Caption = '&Help' + object Support1: TMenuItem + Action = SendMail1 + end + object AboutItem: TMenuItem + Action = About1 + end + end + end + object ActionList1: TActionList + Images = GlobalModule.ToolbarImagesList + Left = 40 + Top = 312 + object Exit1: TAction + Caption = 'Exit' + Hint = 'Exit application' + ImageIndex = 0 + OnExecute = Exit1Execute + end + object Terminate1: TAction + Caption = 'Terminate Process' + Hint = 'Terminate process' + ImageIndex = 1 + ShortCut = 16468 + OnExecute = Terminate1Execute + OnUpdate = Terminate1Update + end + object Refresh1: TAction + Caption = 'Refresh' + Hint = 'Refresh' + ImageIndex = 2 + ShortCut = 116 + OnExecute = Refresh1Execute + end + object About1: TAction + Caption = 'About...' + Hint = 'About' + OnExecute = About1Execute + end + object HotTrack1: TAction + Caption = 'HotTrack' + Hint = 'ListView hottrack' + ImageIndex = 5 + OnExecute = HotTrack1Execute + end + object SaveToFile1: TAction + Caption = 'Save as ...' + Hint = 'Save to text file' + ImageIndex = 3 + ShortCut = 16467 + OnExecute = SaveToFile1Execute + OnUpdate = SaveToFile1Update + end + object FileProperties1: TAction + Caption = 'File Properties' + Hint = 'File properties' + ImageIndex = 4 + ShortCut = 32781 + OnExecute = FileProperties1Execute + OnUpdate = FileProperties1Update + end + object ChangePriority1: TAction + Caption = 'Change Process Priority' + Hint = 'Change process priority' + ImageIndex = 8 + ShortCut = 16464 + OnExecute = ChangePriority1Execute + OnUpdate = Terminate1Update + end + object Copy1: TAction + Caption = 'Copy' + Hint = 'Copy to clipboard' + ImageIndex = 9 + ShortCut = 16451 + OnExecute = Copy1Execute + OnUpdate = SaveToFile1Update + end + object DumpHeap1: TAction + Caption = 'Heap List' + Hint = 'Heap list ' + ImageIndex = 11 + ShortCut = 16456 + OnExecute = DumpHeap1Execute + OnUpdate = Terminate1Update + end + object DumpMemory1: TAction + Caption = 'Memory List' + Hint = 'Virtual Memory list' + ImageIndex = 12 + ShortCut = 16461 + OnExecute = DumpMemory1Execute + OnUpdate = Terminate1Update + end + object DumpModules1: TAction + Caption = 'Modules list' + Hint = 'Lists all mapped modules' + ImageIndex = 7 + ShortCut = 16460 + OnExecute = DumpModules1Execute + end + object InfoTip1: TAction + Caption = 'InfoTip' + Hint = 'Listview infotips' + ImageIndex = 13 + OnExecute = InfoTip1Execute + end + object BeepOnChange1: TAction + Caption = 'Beep on change' + Hint = 'Beep on change in process list' + ImageIndex = 14 + OnExecute = BeepOnChange1Execute + end + object CheckImageBase1: TAction + Caption = 'Check ImageBase' + Hint = 'Check ImageBase' + ImageIndex = 16 + OnExecute = CheckImageBase1Execute + end + object DumpPE1: TAction + Caption = 'Dump PE file' + Hint = 'Dump PE file' + ImageIndex = 22 + ShortCut = 16452 + OnExecute = DumpPE1Execute + OnUpdate = DumpPE1Update + end + object SendMail1: TAction + Caption = 'Support' + ImageIndex = 24 + OnExecute = SendMail1Execute + end + end + object PopupMenu: TPopupMenu + Images = GlobalModule.ToolbarImagesList + Left = 72 + Top = 312 + object RefreshItemP: TMenuItem + Action = Refresh1 + end + object N5: TMenuItem + Caption = '-' + end + object CopyItemP: TMenuItem + Action = Copy1 + end + object SaveItemP: TMenuItem + Action = SaveToFile1 + end + object ChangePriorityItemP: TMenuItem + Action = ChangePriority1 + end + object DumpHeapItemP: TMenuItem + Action = DumpHeap1 + end + object MemoryList1: TMenuItem + Action = DumpMemory1 + end + object Moduleslist2: TMenuItem + Action = DumpModules1 + end + object DumpPEfile2: TMenuItem + Action = DumpPE1 + Default = True + end + object TerminateItemP: TMenuItem + Action = Terminate1 + end + object N3: TMenuItem + Caption = '-' + end + object PropertyItemP: TMenuItem + Action = FileProperties1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/Main.pas b/official/1.100/examples/windows/delphitools/toolhelpview/Main.pas new file mode 100644 index 0000000..b8cf640 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/Main.pas @@ -0,0 +1,936 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is Main.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit Main; + +{$I jcl.inc} +{$IFDEF SUPPORTS_PLATFORM_WARNINGS} + {$WARN SYMBOL_PLATFORM OFF} +{$ENDIF SUPPORTS_PLATFORM_WARNINGS} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ImgList, StdCtrls, ToolWin, Menus, ActnList, ExtCtrls, IniFiles; + +const + UM_ACTIVATEMAINFORM = WM_USER + $100; + +type + TMainForm = class(TForm) + ProcessListView: TListView; + PriorityImagesList: TImageList; + MainMenu: TMainMenu; + ActionList1: TActionList; + Exit1: TAction; + ExitItem: TMenuItem; + File1: TMenuItem; + StatusBar: TStatusBar; + Tools1: TMenuItem; + Terminate1: TAction; + TerminateItem: TMenuItem; + Refresh1: TAction; + RefreshItem: TMenuItem; + About1: TAction; + Help1: TMenuItem; + AboutItem: TMenuItem; + HotTrack1: TAction; + HotTrackItem: TMenuItem; + SaveToFile1: TAction; + SaveItem: TMenuItem; + N2: TMenuItem; + FileProperties1: TAction; + FilePropItem: TMenuItem; + PopupMenu: TPopupMenu; + RefreshItemP: TMenuItem; + SaveItemP: TMenuItem; + TerminateItemP: TMenuItem; + PropertyItemP: TMenuItem; + N3: TMenuItem; + ChangePriority1: TAction; + ChangePriorityItem: TMenuItem; + N5: TMenuItem; + ChangePriorityItemP: TMenuItem; + BottomPanel: TPanel; + ModulesListView: TListView; + ThreadsListView: TListView; + Splitter2: TSplitter; + Splitter1: TSplitter; + Views1: TMenuItem; + N1: TMenuItem; + Copy1: TAction; + CopyItem: TMenuItem; + CopyItemP: TMenuItem; + DumpHeap1: TAction; + DumpHeapItem: TMenuItem; + DumpHeapItemP: TMenuItem; + DumpMemory1: TAction; + DumpMemory11: TMenuItem; + MemoryList1: TMenuItem; + Options1: TMenuItem; + CoolBar1: TCoolBar; + ToolBar1: TToolBar; + RefreshButton: TToolButton; + HottrackButton: TToolButton; + ToolButton7: TToolButton; + CopyButton: TToolButton; + SaveButton: TToolButton; + ToolButton3: TToolButton; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + ToolButton4: TToolButton; + ChangePriButton: TToolButton; + KillButton: TToolButton; + PropertyButton: TToolButton; + ToolButton5: TToolButton; + InfoTip1: TAction; + ToolButton8: TToolButton; + InfoTip2: TMenuItem; + BeepOnChange1: TAction; + ToolButton9: TToolButton; + Beeponchange2: TMenuItem; + CheckImageBase1: TAction; + ToolButton11: TToolButton; + CheckImageBase2: TMenuItem; + DumpModules1: TAction; + ToolButton6: TToolButton; + Moduleslist1: TMenuItem; + N4: TMenuItem; + Moduleslist2: TMenuItem; + DumpPE1: TAction; + DumpPEfile1: TMenuItem; + ToolButton10: TToolButton; + DumpPEfile2: TMenuItem; + SendMail1: TAction; + Support1: TMenuItem; + procedure FormCreate(Sender: TObject); + procedure ProcessListViewCompare(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); + procedure ProcessListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure Exit1Execute(Sender: TObject); + procedure Terminate1Execute(Sender: TObject); + procedure Refresh1Execute(Sender: TObject); + procedure About1Execute(Sender: TObject); + procedure Terminate1Update(Sender: TObject); + procedure HotTrack1Execute(Sender: TObject); + procedure SaveToFile1Update(Sender: TObject); + procedure SaveToFile1Execute(Sender: TObject); + procedure FileProperties1Update(Sender: TObject); + procedure FileProperties1Execute(Sender: TObject); + procedure ProcessListViewEnter(Sender: TObject); + procedure ChangePriority1Execute(Sender: TObject); + procedure Copy1Execute(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure StatusBarResize(Sender: TObject); + procedure DumpHeap1Execute(Sender: TObject); + procedure DumpMemory1Execute(Sender: TObject); + procedure ProcessListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure ModulesListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure ProcessListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: string); + procedure ModulesListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: string); + procedure InfoTip1Execute(Sender: TObject); + procedure BeepOnChange1Execute(Sender: TObject); + procedure CheckImageBase1Execute(Sender: TObject); + procedure ModulesListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure DumpModules1Execute(Sender: TObject); + procedure DumpPE1Update(Sender: TObject); + procedure ProcessListViewDblClick(Sender: TObject); + procedure DumpPE1Execute(Sender: TObject); + procedure SendMail1Execute(Sender: TObject); + procedure CoolBar1Resize(Sender: TObject); + private + FDisableUpdate: Boolean; + FProcess_Cnt, FThreads_Cnt, FModules_Cnt, FModules_Size: LongWord; + FIniFile: TIniFile; + procedure BuildModulesList(ProcessID: DWORD); + procedure BuildProcessList(Rebuild: Boolean = False); + procedure BuildThreadsList(ProcessID: DWORD); + function CheckProcessesChange: Boolean; + function FocusedFileName: TFileName; + procedure KillProcess(ProcessID: DWORD); + procedure LoadSettings; + procedure RebuildViewsMenuHotKeys; + procedure SaveSettings; + function SummaryInfo: string; + procedure TimerRefresh; + procedure UpdateListViewsOptions; + procedure UpdateStatusLine(SummaryOnly: Boolean = False); + procedure ViewsMenuClick(Sender: TObject); + procedure WMTimer(var Msg: TWMTimer); message WM_TIMER; + procedure WMMenuChar(var Msg: TWMMenuChar); message WM_MENUCHAR; + procedure UMActivateMainForm(var Msg: TMessage); message UM_ACTIVATEMAINFORM; + public + procedure AddToViewsMenu(AForm: TForm; const ACaption: string); + procedure DeleteFromViewsMenu(AForm: TForm); + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.DFM} + +uses + TLHelp32, About, ShellAPI, ChangePriority, HeapDump, MemoryDump, Global, + CommCtrl, JclShell, JclSysInfo, JclFileUtils, JclAppInst, ModulesDump, + ToolsUtils, FindDlg, PsApi; + +resourcestring + sCantOpenForTerminate = 'Can''t open this process for terminate.'; + sKill = 'Do you really want to kill process "%s" ?'; + sNotFound = 'Not found'; + sSaveProcessesList = 'ToolHelp process list'; + sSaveModulesList = 'Modules used by process %s'; + sSaveThreadsList = 'Threads created by process %s'; + sWaitTimeout = 'Timeout.'; + sProcessesSummary = 'Processes: %d, Threads: %d'; + sModulesSummary = 'Cnt: %d, Tot.Size: %.0n'; + sNotRelocated = '[base]'; + +const + PROCESS_CLASS_IDLE = 4; + PROCESS_CLASS_NORMAL = 8; + PROCESS_CLASS_HIGH = 13; + PROCESS_CLASS_TIMECRITICAL = 24; + +function GetPriorityIconIndex(Priority: DWORD): Integer; +begin + case Priority of + PROCESS_CLASS_IDLE: Result := 0; + PROCESS_CLASS_HIGH: Result := 1; + PROCESS_CLASS_TIMECRITICAL: Result := 2; + else + Result := -1; + end; +end; + +function GetProcessVersion(Version: DWORD): string; +var + C: array[0..2] of Char; +begin + C[0] := Chr(Lo(LOWORD(Version))); + C[1] := Chr(Hi(LOWORD(Version))); + if C[0] < #32 then C[0] := '_'; + if C[1] < #32 then C[1] := '_'; + C[2] := #0; + Result := Format('%s %d.%d', [C, Hi(HIWORD(Version)), Lo(HIWORD(Version))]); +end; + +{ TMainForm } + +procedure TMainForm.FormCreate(Sender: TObject); +var + FileInfo: TSHFileInfo; + ImageListHandle: THandle; +begin + {$IFDEF COMPILER5_UP} + ProcessListView.OnInfoTip := ProcessListViewInfoTip; + ModulesListView.OnInfoTip := ModulesListViewInfoTip; + {$ELSE COMPILER5_UP} + InfoTip1.Visible := False; + {$ENDIF COMPILER5_UP} + FIniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); + LoadSettings; + ImageListHandle := SHGetFileInfo('', 0, FileInfo, SizeOf(FileInfo), + SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + SendMessage(ProcessListView.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle); + SetTimer(Handle, 1, 500, nil); + BuildProcessList; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + SaveSettings; + FIniFile.UpdateFile; + FIniFile.Free; + Win32Check(KillTimer(Handle, 1)); +end; + +procedure TMainForm.BuildProcessList(Rebuild: Boolean = False); +var + SnapProcHandle, ProcessHandle: THandle; + ProcessEntry: TProcessEntry32; + Next: Boolean; + FileInfo: TSHFileInfo; + ProcessVersion: DWORD; + FindItem: TListItem; + I: Integer; + ProcList: TList; + Added, Changed: Boolean; + + procedure CheckChanged; +begin + if ProcessListView.ItemFocused = FindItem then Changed := True; +end; + +begin + if FDisableUpdate then Exit; + ProcList := TList.Create; + Added := False; + Changed := False; + with ProcessListView do + try + FDisableUpdate := True; + try + if Rebuild then + begin + Screen.Cursor := crHourGlass; + Items.BeginUpdate; + Items.Clear; + FProcess_Cnt := 0; + FThreads_Cnt := 0; + end else + SendMessage(Handle, WM_SETREDRAW, 0, 0); + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if SnapProcHandle <> THandle(-1) then + begin + ProcessEntry.dwSize := Sizeof(ProcessEntry); + Next := Process32First(SnapProcHandle, ProcessEntry); + while Next do + begin + ProcList.Add(Pointer(ProcessEntry.th32ProcessID)); + FindItem := FindData(0, Pointer(ProcessEntry.th32ProcessID), True, False); + with ProcessEntry do if FindItem = nil then + begin // New Process + Added := True; + if IsWin2k then + begin + ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, th32ProcessID); + if Handle <> 0 then + begin + if GetModuleFileNameEx(ProcessHandle, 0, szExeFile, SizeOf(szExeFile)) = 0 then + StrPCopy(szExeFile, '[Idle]'); + CloseHandle(ProcessHandle); + end; + end; + ProcessVersion := SHGetFileInfo(szExeFile, 0, FileInfo, Sizeof(FileInfo), SHGFI_EXETYPE); + SHGetFileInfo(szExeFile, 0, FileInfo, Sizeof(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + with Items.Add, ProcessEntry do + begin + Caption := AnsiLowerCase(ExtractFileName(szExeFile)); + Data := Pointer(th32ProcessID); + ImageIndex := FileInfo.iIcon; + StateIndex := GetPriorityIconIndex(pcPriClassBase); + SubItems.AddObject(Format('%.8x', [th32ProcessID]), Pointer(th32ProcessID)); + SubItems.AddObject(Format('%d', [pcPriClassBase]), Pointer(pcPriClassBase)); + SubItems.AddObject(Format('%d', [cntThreads]), Pointer(cntThreads)); + SubItems.AddObject(GetProcessVersion(ProcessVersion), Pointer(ProcessVersion)); + SubItems.Add(szExeFile); + SubItems.AddObject(Format('(%.8x)', [th32ParentProcessID]), Pointer(th32ParentProcessID)); + Inc(FProcess_Cnt); + Inc(FThreads_Cnt, cntThreads); + end; + end else + with FindItem do + begin // Any changes in existing process ? + if SubItems.Objects[1] <> Pointer(pcPriClassBase) then + begin + SubItems.Objects[1] := Pointer(pcPriClassBase); + SubItems.Strings[1] := Format('%d', [pcPriClassBase]); + StateIndex := GetPriorityIconIndex(pcPriClassBase); + end; + if SubItems.Objects[2] <> Pointer(cntThreads) then + begin + Inc(FThreads_Cnt, cntThreads - DWORD(SubItems.Objects[2])); + SubItems.Objects[2] := Pointer(cntThreads); + SubItems.Strings[2] := Format('%d', [cntThreads]); + CheckChanged; + end; + end; + Next := Process32Next(SnapProcHandle, ProcessEntry); + end; + CloseHandle(SnapProcHandle); + end; + if Added then // find the names of parent processes + begin + for I := 0 to Items.Count - 1 do + begin + FindItem := FindData(0, Items[I].SubItems.Objects[5], True, False); + if FindItem <> nil then Items[I].SubItems[5] := FindItem.Caption; + end; + AlphaSort; + end; + for I := Items.Count - 1 downto 0 do // delete non-existing processes + if ProcList.IndexOf(Items[I].Data) = -1 then + begin + Dec(FProcess_Cnt); + Dec(FThreads_Cnt, DWORD(Items[I].SubItems.Objects[2])); + Items.Delete(I); + end; + if GetNextItem(nil, sdAll, [isSelected]) = nil then + begin + if ItemFocused = nil then ItemFocused := Items[0]; + ItemFocused.Selected := True; + end else + if Changed then BuildThreadsList(DWORD(ItemFocused.Data)); + UpdateStatusLine(True); + finally + if Rebuild then + Items.EndUpdate + else + SendMessage(Handle, WM_SETREDRAW, 1, 0); + end; + finally + FDisableUpdate := False; + ProcList.Free; + Screen.Cursor := crDefault; + end; +end; + +procedure TMainForm.BuildThreadsList(ProcessID: DWORD); +var + SnapProcHandle: THandle; + ThreadEntry: TThreadEntry32; + Next: Boolean; +begin + with ThreadsListView do + try + Items.BeginUpdate; + Items.Clear; + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + if SnapProcHandle <> THandle(-1) then + begin + ThreadEntry.dwSize := Sizeof(ThreadEntry); + Next := Thread32First(SnapProcHandle, ThreadEntry); + while Next do + begin + if ThreadEntry.th32OwnerProcessID = ProcessID then + with Items.Add, ThreadEntry do + begin + Caption := Format('%.8x', [th32ThreadID]); + Data := Pointer(th32ThreadID); + SubItems.AddObject(Format('%d', [tpDeltaPri]), Pointer(tpDeltaPri)); + end; + Next := Thread32Next(SnapProcHandle, ThreadEntry); + end; + CloseHandle(SnapProcHandle); + end; + AlphaSort; + ListViewFocusFirstItem(ThreadsListView); + finally + Items.EndUpdate; + end; +end; + +procedure TMainForm.BuildModulesList(ProcessID: DWORD); +var + SnapProcHandle: THandle; + ModuleEntry: TModuleEntry32; + Next: Boolean; + ImageBase: DWORD; +begin + with ModulesListView do + try + Items.BeginUpdate; + Items.Clear; + FModules_Cnt := 0; + FModules_Size := 0; + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID); + if SnapProcHandle <> THandle(-1) then + begin + ModuleEntry.dwSize := Sizeof(ModuleEntry); + Next := Module32First(SnapProcHandle, ModuleEntry); + while Next do + begin + with Items.Add, ModuleEntry do + begin + Caption := AnsiLowerCase(szModule); + SubItems.AddObject(Format('%.8x', [th32ModuleID]), Pointer(th32ModuleID)); + if CheckImageBase1.Checked then + begin + ImageBase := GetImageBase(szExePath); + if ImageBase = DWORD(modBaseAddr) then + SubItems.AddObject(sNotRelocated, Pointer(0)) + else + SubItems.AddObject(Format('%.8x', [ImageBase]), Pointer(ImageBase)); + end else + SubItems.Add(''); + SubItems.AddObject(Format('%p', [modBaseAddr]), Pointer(modBaseAddr)); + SubItems.AddObject(Format('%.0n', [IntToExtended(modBaseSize)]), Pointer(modBaseSize)); + SubItems.AddObject(Format('%d', [GlblcntUsage]), Pointer(GlblcntUsage)); + SubItems.AddObject(Format('%d', [ProccntUsage]), Pointer(ProccntUsage)); + SubItems.AddObject(Format('%.8x', [hModule]), Pointer(hModule)); + SubItems.Add(szExePath); + Inc(FModules_Cnt); + Inc(FModules_Size, modBaseSize); + end; + Next := Module32Next(SnapProcHandle, ModuleEntry); + end; + CloseHandle(SnapProcHandle); + end; + AlphaSort; + ListViewFocusFirstItem(ModulesListView); + finally + Items.EndUpdate; + end; +end; + +function TMainForm.CheckProcessesChange: Boolean; +var + SnapProcHandle: THandle; + ProcessEntry: TProcessEntry32; + Next: Boolean; + ProcessCount: Integer; + FindItem: TListItem; +begin + Result := False; + ProcessCount := 0; + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if SnapProcHandle <> THandle(-1) then + begin + ProcessEntry.dwSize := Sizeof(ProcessEntry); + Next := Process32First(SnapProcHandle, ProcessEntry); + while Next and (not Result) do + begin + Inc(ProcessCount); + FindItem := ProcessListView.FindData(0, Pointer(ProcessEntry.th32ProcessID), True, False); + if FindItem = nil then + Result := True + else + with FindItem do + Result := (SubItems.Objects[1] <> Pointer(ProcessEntry.pcPriClassBase)) or + (SubItems.Objects[2] <> Pointer(ProcessEntry.cntThreads)); + Next := Process32Next(SnapProcHandle, ProcessEntry); + end; + CloseHandle(SnapProcHandle); + end; + Result := Result or (ProcessCount <> ProcessListView.Items.Count); +end; + +function TMainForm.FocusedFileName: TFileName; +begin + if (ActiveControl = ProcessListView) and (ProcessListView.ItemFocused <> nil) then + Result := ProcessListView.ItemFocused.SubItems[4] else + if (ActiveControl = ModulesListView) and (ModulesListView.ItemFocused <> nil) then + Result := ModulesListView.ItemFocused.SubItems[7] else + Result := ''; +end; + +procedure TMainForm.KillProcess(ProcessID: DWORD); +var + ProcessHandle: THandle; +begin + ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS{PROCESS_TERMINATE}, False, ProcessID); + if ProcessHandle <> 0 then + begin + TerminateProcess(ProcessHandle, 0); + if WaitForSingleObject(ProcessHandle, 10000) = WAIT_TIMEOUT then + MessBox(sWaitTimeout, MB_ICONWARNING); + CloseHandle(ProcessHandle); + BuildProcessList; + end else + MessBox(sCantOpenForTerminate, MB_ICONERROR); +end; + +function TMainForm.SummaryInfo: string; +begin + if (ActiveControl = ProcessListView) then + Result := Format(sProcessesSummary , [FProcess_Cnt, FThreads_Cnt]) else + if (ActiveControl = ModulesListView) then + Result := Format(sModulesSummary , [FModules_Cnt, IntToExtended(FModules_Size)]) else + Result := ''; +end; + +procedure TMainForm.TimerRefresh; +begin + if not Application.Terminated and IsWindowEnabled(Handle) and CheckProcessesChange then + begin + BuildProcessList; + if BeepOnChange1.Checked then MessageBeep(MB_OK); + end; +end; + +procedure TMainForm.UpdateStatusLine(SummaryOnly: Boolean = False); +var + FileName: TFileName; +begin + FileName := FocusedFileName; + with StatusBar.Panels do + begin + BeginUpdate; + if not SummaryOnly then + begin + Items[0].Text := ''; + Items[1].Text := ''; + if VersionResourceAvailable(FileName) then + try + with TJclFileVersionInfo.Create(FileName) do + try + StatusBar.Panels.Items[0].Text := FileVersion; + StatusBar.Panels.Items[1].Text := FileDescription; + finally + Free; + end; + except + end else + Items[0].Text := sNotFound; + end; + Items[2].Text := SummaryInfo; + EndUpdate; + end; +end; + +procedure TMainForm.ProcessListViewCompare(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); +begin + LVCompare(TListView(Sender), Item1, Item2, Compare); +end; + +procedure TMainForm.ProcessListViewColumnClick(Sender: TObject; + Column: TListColumn); +begin + LVColumnClick(Column); +end; + +procedure TMainForm.ProcessListViewEnter(Sender: TObject); +begin + UpdateStatusLine; +end; + +procedure TMainForm.Exit1Execute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.BeepOnChange1Execute(Sender: TObject); +begin + with BeepOnChange1 do + Checked := not Checked; +end; + +procedure TMainForm.HotTrack1Execute(Sender: TObject); +begin + with HotTrack1 do + begin + Checked := not Checked; + UpdateListViewsOptions; + end; +end; + +procedure TMainForm.InfoTip1Execute(Sender: TObject); +begin + with InfoTip1 do + begin + Checked := not Checked; + UpdateListViewsOptions; + end; +end; + +procedure TMainForm.CheckImageBase1Execute(Sender: TObject); +begin + with CheckImageBase1 do + begin + Checked := not Checked; + ProcessListViewSelectItem(nil, ProcessListView.Selected, Assigned(ProcessListView.Selected)); + end; +end; + +procedure TMainForm.Terminate1Execute(Sender: TObject); +begin + with ProcessListView do if (ItemFocused <> nil) and + (MessBoxFmt(sKill, [ItemFocused.Caption], MB_ICONEXCLAMATION or MB_YESNO or MB_DEFBUTTON2) = ID_YES) then + KillProcess(DWORD(ItemFocused.Data)); +end; + +procedure TMainForm.Refresh1Execute(Sender: TObject); +begin + BuildProcessList(True); +end; + +procedure TMainForm.About1Execute(Sender: TObject); +begin + ShowToolsAboutBox; +end; + +procedure TMainForm.ChangePriority1Execute(Sender: TObject); +begin + with TChangePriorityDlg.Create(Application) do + try + ProcessID := DWORD(ProcessListView.ItemFocused.Data); + ShowModal; + finally + Free; + end; +end; + +procedure TMainForm.Terminate1Update(Sender: TObject); +begin + TAction(Sender).Enabled := (ActiveControl = ProcessListView) and + (ProcessListView.ItemFocused <> nil); +end; + +procedure TMainForm.SaveToFile1Update(Sender: TObject); +begin + TAction(Sender).Enabled := ActiveControl is TListView; +end; + +procedure TMainForm.SaveToFile1Execute(Sender: TObject); +var + FileName: string; +begin + if ActiveControl = ProcessListView then + FileName := sSaveProcessesList else + if ActiveControl = ThreadsListView then + FileName := Format(sSaveThreadsList, [ProcessListView.ItemFocused.Caption]) else + if ActiveControl = ModulesListView then + FileName := Format(sSaveModulesList, [ProcessListView.ItemFocused.Caption]); + GlobalModule.ListViewToFile(ActiveControl as TListView, FileName); +end; + +procedure TMainForm.FileProperties1Update(Sender: TObject); +begin + FileProperties1.Enabled := + (ActiveControl = ProcessListView) or (ActiveControl = ModulesListView); +end; + +procedure TMainForm.FileProperties1Execute(Sender: TObject); +begin + DisplayPropDialog(Application.Handle, FocusedFileName); +end; + +procedure TMainForm.AddToViewsMenu(AForm: TForm; const ACaption: string); +var + Item: TMenuItem; +begin + Item := TMenuItem.Create(Views1); + Item.Caption := ACaption; + Item.Tag := Integer(AForm); + Item.OnClick := ViewsMenuClick; + Views1.Add(Item); + RebuildViewsMenuHotKeys; +end; + +procedure TMainForm.DeleteFromViewsMenu(AForm: TForm); +var + I: Integer; +begin + with Views1 do + for I := 0 to Count - 1 do + if Pointer(Items[I].Tag) = AForm then + begin + Items[I].Free; + System.Break; + end; + RebuildViewsMenuHotKeys; +end; + +procedure TMainForm.ViewsMenuClick(Sender: TObject); +begin + TForm(TMenuItem(Sender).Tag).BringToFront; +end; + +procedure TMainForm.RebuildViewsMenuHotKeys; +var + I: Integer; +begin + for I := 0 to Views1.Count - 1 do + if I < 9 then + Views1.Items[I].ShortCut := ShortCut(I + 49, [ssAlt]) + else + Views1.Items[I].ShortCut := 0; + Views1.Visible := Views1.Count > 0; +end; + +procedure TMainForm.Copy1Execute(Sender: TObject); +begin + GlobalModule.ListViewToClipboard(ActiveControl as TListView); +end; + +procedure TMainForm.WMTimer(var Msg: TWMTimer); +begin + if Msg.TimerID = 1 then + begin + TimerRefresh; + Msg.Result := 0; + end else inherited; +end; + +procedure TMainForm.WMMenuChar(var Msg: TWMMenuChar); +begin + inherited; + if Msg.Result = MNC_IGNORE then + PostMessage(Handle, UM_ACTIVATEMAINFORM, 0, 0); +end; + +procedure TMainForm.UMActivateMainForm(var Msg: TMessage); +begin + BringToFront; +end; + +procedure TMainForm.StatusBarResize(Sender: TObject); +begin + with StatusBar do + Panels[1].Width := Width - Panels[0].Width - Panels[2].Width; +end; + +procedure TMainForm.DumpHeap1Execute(Sender: TObject); +begin + FDisableUpdate := True; + try + with THeapDumpForm.Create(Application) do + begin + with ProcessListView.ItemFocused do SetParams(DWORD(Data), Caption); + Show; + end; + finally + FDisableUpdate := False; + end; +end; + +procedure TMainForm.DumpMemory1Execute(Sender: TObject); +begin + FDisableUpdate := True; + try + with TMemoryDumpForm.Create(Application) do + try + with ProcessListView.ItemFocused do SetParams(DWORD(Data), Caption); + Show; + except + Free; + raise + end; + finally + FDisableUpdate := False; + end; +end; + +procedure TMainForm.ProcessListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected then + begin + BuildThreadsList(DWORD(Item.Data)); + BuildModulesList(DWORD(Item.Data)); + UpdateStatusLine; + end; +end; + +procedure TMainForm.ModulesListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected and TWinControl(Sender).Focused then UpdateStatusLine; +end; + +procedure TMainForm.ProcessListViewInfoTip(Sender: TObject; + Item: TListItem; var InfoTip: string); +begin + InfoTip := InfoTipVersionString(Item.SubItems[4]); +end; + +procedure TMainForm.ModulesListViewInfoTip(Sender: TObject; + Item: TListItem; var InfoTip: string); +begin + InfoTip := InfoTipVersionString(Item.SubItems[7]); +end; + +procedure TMainForm.LoadSettings; +begin + with FIniFile do + begin + Left := ReadInteger(Name, 'Left', Left); + Top := ReadInteger(Name, 'Top', Top); + Width := ReadInteger(Name, 'Width', Width); + Height := ReadInteger(Name, 'Height', Height); + HotTrack1.Checked := ReadBool('Options', HotTrack1.Name, HotTrack1.Checked); + InfoTip1.Checked := ReadBool('Options', InfoTip1.Name, InfoTip1.Checked); + BeepOnChange1.Checked := ReadBool('Options', BeepOnChange1.Name, BeepOnChange1.Checked); + CheckImageBase1.Checked := ReadBool('Options', CheckImageBase1.Name, CheckImageBase1.Checked); + end; + UpdateListViewsOptions; +end; + +procedure TMainForm.SaveSettings; +begin + with FIniFile do + begin + WriteInteger(Name, 'Left', Left); + WriteInteger(Name, 'Top', Top); + WriteInteger(Name, 'Width', Width); + WriteInteger(Name, 'Height', Height); + WriteBool('Options', HotTrack1.Name, HotTrack1.Checked); + WriteBool('Options', InfoTip1.Name, InfoTip1.Checked); + WriteBool('Options', BeepOnChange1.Name, BeepOnChange1.Checked); + WriteBool('Options', CheckImageBase1.Name, CheckImageBase1.Checked); + end; +end; + +procedure TMainForm.UpdateListViewsOptions; +begin + ProcessListView.HotTrack := HotTrack1.Checked; + ThreadsListView.HotTrack := HotTrack1.Checked; + ModulesListView.HotTrack := HotTrack1.Checked; + ProcessListView.ShowHint := InfoTip1.Checked; + ThreadsListView.ShowHint := InfoTip1.Checked; + ModulesListView.ShowHint := InfoTip1.Checked; +end; + +procedure TMainForm.ModulesListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +begin + if Item.SubItems.Objects[1] <> nil then + Sender.Canvas.Font.Style := [fsunderline]; +end; + +procedure TMainForm.DumpModules1Execute(Sender: TObject); +begin + if not Assigned(ModulesDumpForm) then + ModulesDumpForm := TModulesDumpForm.Create(Application); + ModulesDumpForm.Show; +end; + +procedure TMainForm.DumpPE1Update(Sender: TObject); +begin + DumpPE1.Enabled := GlobalModule.PeViewerRegistred and (Length(FocusedFileName) > 0); +end; + +procedure TMainForm.ProcessListViewDblClick(Sender: TObject); +begin + DumpPE1.Execute; +end; + +procedure TMainForm.DumpPE1Execute(Sender: TObject); +begin + GlobalModule.ViewPE(FocusedFileName); +end; + +procedure TMainForm.SendMail1Execute(Sender: TObject); +begin + SendEmail; +end; + +procedure TMainForm.CoolBar1Resize(Sender: TObject); +begin + D4FixCoolBarResizePaint(Sender); +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.dfm new file mode 100644 index 0000000..5b14849 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.dfm @@ -0,0 +1,282 @@ +inherited MemoryDumpForm: TMemoryDumpForm + Left = 206 + Top = 116 + Width = 654 + Height = 423 + Caption = 'MemoryDumpForm' + OldCreateOrder = True + OnCreate = FormCreate + OnDestroy = FormDestroy + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter [0] + Left = 0 + Top = 191 + Width = 646 + Height = 3 + Cursor = crVSplit + Align = alBottom + AutoSnap = False + ResizeStyle = rsUpdate + end + object Splitter2: TSplitter [1] + Left = 105 + Top = 26 + Width = 3 + Height = 165 + Cursor = crHSplit + AutoSnap = False + ResizeStyle = rsUpdate + end + inherited CoolBar: TCoolBar + Width = 646 + Bands = < + item + Control = ToolBar + ImageIndex = -1 + MinHeight = 22 + Width = 642 + end> + inherited ToolBar: TToolBar + Width = 629 + object ToolButton5: TToolButton + Left = 0 + Top = 0 + Action = Refresh1 + end + object ToolButton6: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton6' + ImageIndex = 1 + Style = tbsSeparator + end + object ToolButton1: TToolButton + Left = 31 + Top = 0 + Action = Copy1 + end + object ToolButton2: TToolButton + Left = 54 + Top = 0 + Action = SaveToFile1 + end + object ToolButton10: TToolButton + Left = 77 + Top = 0 + Action = Find1 + end + object ToolButton9: TToolButton + Left = 100 + Top = 0 + Action = SaveData1 + end + object ToolButton3: TToolButton + Left = 123 + Top = 0 + Width = 8 + Caption = 'ToolButton3' + ImageIndex = 4 + Style = tbsSeparator + end + object ToolButton4: TToolButton + Left = 131 + Top = 0 + Action = SelectAll1 + end + object ToolButton7: TToolButton + Left = 154 + Top = 0 + Width = 8 + Caption = 'ToolButton7' + ImageIndex = 18 + Style = tbsSeparator + end + object ToolButton8: TToolButton + Left = 162 + Top = 0 + Action = ViewAsText1 + Style = tbsCheck + end + end + end + object StatusBar: TStatusBar [3] + Left = 0 + Top = 377 + Width = 646 + Height = 19 + Panels = < + item + Width = 65 + end + item + Width = 130 + end + item + Width = 130 + end + item + Width = 50 + end> + SimplePanel = False + end + object PagesListView: TListView [4] + Left = 108 + Top = 26 + Width = 538 + Height = 165 + Align = alClient + AllocBy = 64 + Columns = < + item + Caption = 'Base' + Width = 80 + end + item + Caption = 'Protect' + Width = 75 + end + item + Caption = 'Allocation' + Width = 65 + end + item + Caption = 'Alloc.protect' + Width = 75 + end + item + Alignment = taRightJustify + Caption = 'Region size' + Width = 90 + end + item + Caption = 'State' + Width = 60 + end + item + Caption = 'ModuleName' + Width = 100 + end + item + Caption = 'Type' + end> + ColumnClick = False + HideSelection = False + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + SmallImages = GlobalModule.ToolbarImagesList + TabOrder = 1 + ViewStyle = vsReport + OnCustomDrawItem = PagesListViewCustomDrawItem + OnData = PagesListViewData + OnSelectItem = PagesListViewSelectItem + end + object DumpListView: TListView [5] + Left = 0 + Top = 194 + Width = 646 + Height = 183 + Align = alBottom + Columns = < + item + Caption = 'Address' + Width = 80 + end + item + Caption = 'Data' + Width = 350 + end + item + Caption = 'ASCII' + Width = 130 + end> + ColumnClick = False + Font.Charset = EASTEUROPE_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Courier New' + Font.Style = [] + MultiSelect = True + OwnerData = True + ReadOnly = True + RowSelect = True + ParentFont = False + PopupMenu = PopupMenu + TabOrder = 2 + ViewStyle = vsReport + OnData = DumpListViewData + end + object MemoryTreeView: TTreeView [6] + Left = 0 + Top = 26 + Width = 105 + Height = 165 + Align = alLeft + Images = GlobalModule.ToolbarImagesList + Indent = 19 + ReadOnly = True + TabOrder = 4 + OnChange = MemoryTreeViewChange + OnGetSelectedIndex = MemoryTreeViewGetSelectedIndex + end + inherited ActionList: TActionList + inherited Refresh1: TAction + OnExecute = Refresh1Execute + end + object ViewAsText1: TAction + Caption = 'View as text' + Hint = 'View as text' + ImageIndex = 23 + ShortCut = 16468 + OnExecute = ViewAsText1Execute + end + object SaveData1: TAction + Caption = 'Save data' + Hint = 'Save region data' + ImageIndex = 25 + ShortCut = 16452 + OnExecute = SaveData1Execute + OnUpdate = SaveData1Update + end + end + inherited PopupMenu: TPopupMenu + object Refresh2: TMenuItem + Action = Refresh1 + end + object N1: TMenuItem + Caption = '-' + end + object Copy2: TMenuItem + Action = Copy1 + end + object Save1: TMenuItem + Action = SaveToFile1 + end + object Savedata2: TMenuItem + Action = SaveData1 + end + object N2: TMenuItem + Caption = '-' + end + object Selectall2: TMenuItem + Action = SelectAll1 + end + object N3: TMenuItem + Caption = '-' + end + object Viewastext2: TMenuItem + Action = ViewAsText1 + end + end + object SaveDataDialog: TSaveDialog + DefaultExt = 'bin' + Filter = 'Binary files (*.bin)|*.bin|All files (*.*)|*.*' + Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing] + Left = 104 + Top = 224 + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.pas b/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.pas new file mode 100644 index 0000000..4458caa --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/MemoryDump.pas @@ -0,0 +1,514 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is MemoryDump.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit MemoryDump; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ComCtrls, ToolWin, ActnList, ExtCtrls, ViewTemplate, Menus; + +type + TMemoryInfo = packed record + MemInfo: TMemoryBasicInformation; + RepeatedItem, MappedFile: Boolean; + end; + + TMemoryDumpForm = class(TViewForm) + StatusBar: TStatusBar; + PagesListView: TListView; + Splitter1: TSplitter; + DumpListView: TListView; + ToolButton5: TToolButton; + ToolButton6: TToolButton; + MemoryTreeView: TTreeView; + Splitter2: TSplitter; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + ToolButton3: TToolButton; + ToolButton4: TToolButton; + Refresh2: TMenuItem; + N1: TMenuItem; + Copy2: TMenuItem; + Save1: TMenuItem; + N2: TMenuItem; + Selectall2: TMenuItem; + ViewAsText1: TAction; + ToolButton7: TToolButton; + ToolButton8: TToolButton; + N3: TMenuItem; + Viewastext2: TMenuItem; + SaveData1: TAction; + ToolButton9: TToolButton; + Savedata2: TMenuItem; + SaveDataDialog: TSaveDialog; + ToolButton10: TToolButton; + procedure Refresh1Execute(Sender: TObject); + procedure DumpListViewData(Sender: TObject; Item: TListItem); + procedure PagesListViewSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure FormDestroy(Sender: TObject); + procedure PagesListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure FormCreate(Sender: TObject); + procedure PagesListViewData(Sender: TObject; Item: TListItem); + procedure MemoryTreeViewChange(Sender: TObject; Node: TTreeNode); + procedure MemoryTreeViewGetSelectedIndex(Sender: TObject; + Node: TTreeNode); + procedure ViewAsText1Execute(Sender: TObject); + procedure SaveData1Update(Sender: TObject); + procedure SaveData1Execute(Sender: TObject); + private + FDumpBytesPerLine: Integer; + FProcessID: DWORD; + FProcess: THandle; + FFileName: TFileName; + FMemoryInfo: array of TMemoryInfo; + FModulesList: TStringList; + procedure BuildPagesList; + procedure BuildModulesList; + procedure UpdateDumpList; + public + procedure SetParams(ProcessID: DWORD; const FileName: TFileName); + end; + +var + MemoryDumpForm: TMemoryDumpForm; + +implementation + +uses Global, TLHelp32, ToolsUtils, FindDlg, JclBase; + +{$R *.DFM} + +resourcestring + sAllocations = 'Allocations'; + sCaption = 'Virtual Memory list - %s'; + sCommited = 'Comitted: %.0n'; + sCount = 'Count: %d'; + sModules = 'Modules'; + sReserved = 'Reserved: %.0n'; + +function AllocationProtectStr(P: DWORD): string; +begin + case P of + PAGE_NOACCESS: + Result := 'NoAccess'; + PAGE_READONLY: + Result := 'ReadOnly'; + PAGE_READWRITE: + Result := 'ReadWrite'; + PAGE_WRITECOPY: + Result := 'WriteCopy'; + PAGE_EXECUTE: + Result := 'Exec'; + PAGE_EXECUTE_READ: + Result := 'ExecRead'; + PAGE_EXECUTE_READWRITE: + Result := 'ExecReadWrite'; + PAGE_EXECUTE_WRITECOPY: + Result := 'ExecWriteCopy'; + PAGE_GUARD: + Result := 'Guard'; + PAGE_NOCACHE: + Result := 'NoCache'; + else + Result := ''; + end; +end; + +function StateStr(P: DWORD): string; +begin + case P of + MEM_COMMIT: + Result := 'Commit'; + MEM_FREE: + Result := 'Free'; + MEM_RESERVE: + Result := 'Reserve'; + else + Result := Format('%x', [P]); + end; +end; + +function TypeStr(P: DWORD): string; +begin + case P of + MEM_IMAGE: + Result := 'Image'; + MEM_MAPPED: + Result := 'Mapped'; + MEM_PRIVATE: + Result := 'Private'; + else + Result := Format('%x', [P]); + end; +end; + +function ImageIndexFromInfo(MemInfo: TMemoryInfo): Integer; +begin + with MemInfo do + if MappedFile then Result := 6 else + if RepeatedItem then Result := 21 else + Result := 19; +end; + +{ TMemoryDumpForm } + +procedure TMemoryDumpForm.FormCreate(Sender: TObject); +begin + inherited; + FModulesList := TStringList.Create; +end; + +procedure TMemoryDumpForm.FormDestroy(Sender: TObject); +begin + FModulesList.Free; + if FProcess <> 0 then CloseHandle(FProcess); +end; + +procedure TMemoryDumpForm.BuildPagesList; +var + AllocationsNode, ModulesNode, TempNode: TTreeNode; + LastAllocationBase: Pointer; + LastMappedFile: Boolean; + I, N, TotalCommit, TotalReserve: Integer; + + procedure EnumAllocations; +var + P: PChar; + MI: TMemoryBasicInformation; + Res: DWORD; + Count: Integer; +begin + FMemoryInfo := nil; + Count := 0; + P := Pointer(0); + Res := VirtualQueryEx(FProcess, P, MI, SizeOf(MI)); + if Res <> SizeOf(MI) then RaiseLastOSError; + while Res = SizeOf(MI) do + begin + if MI.AllocationBase <> nil then + begin + SetLength(FMemoryInfo, Count + 1); + FMemoryInfo[Count].MemInfo := MI; + Inc(Count); + end; + Inc(P, MI.RegionSize); + Res := VirtualQueryEx(FProcess, P, MI, SizeOf(MI)); + end; +end; + +begin + Screen.Cursor := crHourGlass; + try + PagesListView.Items.BeginUpdate; + PagesListView.Items.Count := 0; + MemoryTreeView.Items.BeginUpdate; + StatusBar.Panels.BeginUpdate; + try + EnumAllocations; + PagesListView.Items.Count := Length(FMemoryInfo); + + with MemoryTreeView.Items do + begin + Clear; + AllocationsNode := AddFirst(nil, sAllocations); + AllocationsNode.ImageIndex := 19; + ModulesNode := Add(nil, sModules); + ModulesNode.ImageIndex := 6; + LastAllocationBase := nil; + LastMappedFile := False; + for I := 0 to Length(FMemoryInfo) - 1 do + with FMemoryInfo[I] do + if LastAllocationBase <> MemInfo.AllocationBase then + begin + TempNode := AddChildObject(AllocationsNode, Format('%p', [MemInfo.AllocationBase]), Pointer(I)); + with TempNode do ImageIndex := Parent.ImageIndex; + LastAllocationBase := MemInfo.AllocationBase; + RepeatedItem := False; + N := FModulesList.IndexOfObject(LastAllocationBase); + if N <> -1 then + begin + TempNode := AddChildObject(ModulesNode, FModulesList[N], Pointer(I)); + with TempNode do ImageIndex := Parent.ImageIndex; + MappedFile := True; + end else + MappedFile := False; + LastMappedFile := MappedFile; + end else + begin + RepeatedItem := True; + MappedFile := LastMappedFile; + end; + end; + AllocationsNode.AlphaSort; + ModulesNode.AlphaSort; + + TotalCommit := 0; + TotalReserve := 0; + for I := 0 to Length(FMemoryInfo) - 1 do with FMemoryInfo[I].MemInfo do + case State of + MEM_COMMIT: Inc(TotalCommit, RegionSize); + MEM_RESERVE: Inc(TotalReserve, RegionSize); + end; + with StatusBar do + begin + Panels[0].Text := Format(sCount, [Length(FMemoryInfo)]); + Panels[1].Text := Format(sCommited, [IntToExtended(TotalCommit)]); + Panels[2].Text := Format(sReserved, [IntToExtended(TotalReserve)]); + end; + + ListViewFocusFirstItem(PagesListView); + finally + PagesListView.Items.EndUpdate; + MemoryTreeView.Items.EndUpdate; + StatusBar.Panels.EndUpdate; + end; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TMemoryDumpForm.BuildModulesList; +var + SnapProcHandle: THandle; + ModuleEntry: TModuleEntry32; + Next: Boolean; +begin + FModulesList.Clear; + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, FProcessID); + if SnapProcHandle <> THandle(-1) then + begin + ModuleEntry.dwSize := SizeOf(ModuleEntry); + Next := Module32First(SnapProcHandle, ModuleEntry); + while Next do + begin + FModulesList.AddObject(ModuleEntry.szModule, Pointer(ModuleEntry.modBaseAddr)); + Next := Module32Next(SnapProcHandle, ModuleEntry); + end; + CloseHandle(SnapProcHandle); + end; +end; + +procedure TMemoryDumpForm.SetParams(ProcessID: DWORD; const FileName: TFileName); +begin + FProcessID := ProcessID; + FFileName := FileName; + Caption := Format(sCaption, [FFileName]); + Refresh1.Execute; +end; + +procedure TMemoryDumpForm.UpdateDumpList; +begin + with DumpListView do + begin + if ViewAsText1.Checked then + begin + FDumpBytesPerLine := 64; + Columns[1].Caption := 'Ansi text'; + Columns[2].Caption := 'Unicode text'; + end else + begin + FDumpBytesPerLine := 16; + Columns[1].Caption := 'Data'; + Columns[2].Caption := 'ASCII'; + end; + Items.Count := Integer(PagesListView.Selected.SubItems.Objects[3]) div FDumpBytesPerLine; + Invalidate; + end; +end; + +procedure TMemoryDumpForm.Refresh1Execute(Sender: TObject); +begin + if FProcess <> 0 then CloseHandle(FProcess); + FProcess := OpenProcess(PROCESS_ALL_ACCESS, False, FProcessID); + if FProcess = 0 then + begin + Close; + RaiseLastOSError; + end; + BuildModulesList; + BuildPagesList; +end; + +procedure TMemoryDumpForm.DumpListViewData(Sender: TObject; Item: TListItem); +var + Address: Pointer; + LineData: packed array[0..63] of Byte; + NR: DWORD; + Hex, Ascii, S: string; + I: Integer; + W: PWideChar; +begin + with TListView(Sender) do + if PagesListView.Selected <> nil then + begin + Address := Pointer(DWORD(FMemoryInfo[PagesListView.Selected.Index].MemInfo.BaseAddress) + DWORD(Item.Index * FDumpBytesPerLine)); + SetLength(Hex, 3 * SizeOf(LineData)); + SetLength(Ascii, 3 * SizeOf(LineData)); + Hex := ''; + Ascii := ''; + if ReadProcessMemory(FProcess, Address, @LineData, SizeOf(LineData), NR) and (NR = SizeOf(LineData)) then + begin + if ViewAsText1.Checked then + begin + for I := 0 to FDumpBytesPerLine - 1 do + begin + if LineData[I] >= 32 then + Hex := Hex + Chr(LineData[I]) + else + Hex := Hex + '.'; + end; + W := PWideChar(@LineData); + for I := 0 to FDumpBytesPerLine div 2 - 1 do + begin + SetLength(S, 1); + WideCharToMultiByte(CP_ACP, 0, W, 1, PChar(S), 1, nil, nil); + S := PChar(S); + if Length(S) = 0 then S := '.'; + Ascii := Ascii + S; + Inc(W); + end; + end else + begin + for I := 0 to FDumpBytesPerLine - 1 do + begin + Hex := Hex + Format('%.2x ', [LineData[I]]); + if LineData[I] >= 32 then + Ascii := Ascii + Chr(LineData[I]) + else + Ascii := Ascii + '.'; + end; + end; + end; + Item.Caption := Format('%p', [Address]); + Item.SubItems.Add(Hex); + Item.SubItems.Add(Ascii); + end; +end; + +procedure TMemoryDumpForm.PagesListViewSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +begin + if Selected then + begin + if (DWORD(Item.SubItems.Objects[0]) = PAGE_NOACCESS) or + (DWORD(Item.SubItems.Objects[2]) = 0) then + begin + DumpListView.Items.Count := 0; + DumpListView.Invalidate; + end else + UpdateDumpList; + end; +end; + +procedure TMemoryDumpForm.PagesListViewData(Sender: TObject; Item: TListItem); +var + I: Integer; +begin + with Item, FMemoryInfo[Item.Index].MemInfo do + begin + Caption := Format('%p', [BaseAddress]); + SubItems.AddObject(AllocationProtectStr(Protect), Pointer(Protect)); + SubItems.AddObject(Format('%p', [AllocationBase]), AllocationBase); + SubItems.AddObject(AllocationProtectStr(AllocationProtect), Pointer(AllocationProtect)); + SubItems.AddObject(Format('%.0n', [IntToExtended(RegionSize)]), Pointer(RegionSize)); + SubItems.AddObject(StateStr(State), Pointer(State)); + I := FModulesList.IndexOfObject(AllocationBase); + if I <> - 1 then SubItems.Add(FModulesList[I]) else SubItems.Add(''); + SubItems.AddObject(TypeStr(Type_9), Pointer(Type_9)); + end; + Item.ImageIndex := ImageIndexFromInfo(FMemoryInfo[Item.Index]); +end; + +procedure TMemoryDumpForm.PagesListViewCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); +begin + if DWORD(Item.SubItems.Objects[0]) = PAGE_NOACCESS then + Sender.Canvas.Font.Color := clBtnFace; +end; + +procedure TMemoryDumpForm.MemoryTreeViewChange(Sender: TObject; Node: TTreeNode); +begin + if Node.Level = 1 then + with PagesListView do + begin + while Assigned(Selected) do Selected.Selected := False; + ItemFocused := PagesListView.Items[Integer(Node.Data)]; + ItemFocused.Selected := True; + ItemFocused.MakeVisible(False); + end; +end; + +procedure TMemoryDumpForm.MemoryTreeViewGetSelectedIndex(Sender: TObject; + Node: TTreeNode); +begin + Node.SelectedIndex := Node.ImageIndex; +end; + +procedure TMemoryDumpForm.ViewAsText1Execute(Sender: TObject); +begin + with ViewAsText1 do + Checked := not Checked; + UpdateDumpList; +end; + +procedure TMemoryDumpForm.SaveData1Update(Sender: TObject); +begin + TAction(Sender).Enabled := (ActiveControl = PagesListView) and + (PagesListView.Selected <> nil) and + (DWORD(PagesListView.Selected.SubItems.Objects[0]) <> PAGE_NOACCESS); +end; + +procedure TMemoryDumpForm.SaveData1Execute(Sender: TObject); +var + MS: TMemoryStream; + NR: DWORD; +begin + with SaveDataDialog, FMemoryInfo[PagesListView.Selected.Index].MemInfo do + begin + FileName := ''; + if Execute then + begin + MS := TMemoryStream.Create; + try + MS.Size := RegionSize; + if ReadProcessMemory(FProcess, BaseAddress, MS.Memory, RegionSize, NR) and + (NR = RegionSize) then + MS.SaveToFile(FileName) + else + RaiseLastOSError; + finally + MS.Free; + end; + end; + end; +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.dfm new file mode 100644 index 0000000..71750ff --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.dfm @@ -0,0 +1,180 @@ +inherited ModulesDumpForm: TModulesDumpForm + Left = 235 + Top = 159 + Width = 469 + Height = 336 + ActiveControl = ModulesListView + Caption = 'Modules list' + OldCreateOrder = True + PixelsPerInch = 96 + TextHeight = 13 + inherited CoolBar: TCoolBar + Width = 461 + Bands = < + item + Control = ToolBar + ImageIndex = -1 + MinHeight = 22 + Width = 457 + end> + inherited ToolBar: TToolBar + Width = 444 + object ToolButton1: TToolButton + Left = 0 + Top = 0 + Action = Refresh1 + end + object ToolButton2: TToolButton + Left = 23 + Top = 0 + Width = 8 + Caption = 'ToolButton2' + ImageIndex = 3 + Style = tbsSeparator + end + object ToolButton3: TToolButton + Left = 31 + Top = 0 + Action = Copy1 + end + object ToolButton4: TToolButton + Left = 54 + Top = 0 + Action = SaveToFile1 + end + object ToolButton10: TToolButton + Left = 77 + Top = 0 + Action = Find1 + end + object ToolButton5: TToolButton + Left = 100 + Top = 0 + Width = 8 + Caption = 'ToolButton5' + ImageIndex = 4 + Style = tbsSeparator + end + object ToolButton6: TToolButton + Left = 108 + Top = 0 + Action = SelectAll1 + end + object ToolButton7: TToolButton + Left = 131 + Top = 0 + Width = 8 + Caption = 'ToolButton7' + ImageIndex = 18 + Style = tbsSeparator + end + object ToolButton8: TToolButton + Left = 139 + Top = 0 + Action = FileProp1 + end + object ToolButton9: TToolButton + Left = 162 + Top = 0 + Action = DumpPe1 + end + end + end + object StatusBar: TStatusBar [1] + Left = 0 + Top = 290 + Width = 461 + Height = 19 + Panels = < + item + Width = 90 + end + item + Width = 50 + end> + SimplePanel = False + end + object ModulesListView: TListView [2] + Left = 0 + Top = 26 + Width = 461 + Height = 264 + Align = alClient + Columns = < + item + Caption = 'Module' + Width = 80 + end + item + Alignment = taRightJustify + Caption = 'Usage' + end + item + Alignment = taRightJustify + Caption = 'Relocated' + Width = 70 + end + item + Caption = 'Filename' + Width = 300 + end> + HideSelection = False + MultiSelect = True + ReadOnly = True + RowSelect = True + PopupMenu = PopupMenu + SmallImages = GlobalModule.ToolbarImagesList + TabOrder = 2 + ViewStyle = vsReport + OnColumnClick = ModulesListViewColumnClick + OnCompare = ModulesListViewCompare + OnInfoTip = ModulesListViewInfoTip + end + inherited ActionList: TActionList + inherited Refresh1: TAction + OnExecute = Refresh1Execute + end + object FileProp1: TAction + Caption = 'Properties' + Hint = 'File properties' + ImageIndex = 4 + ShortCut = 32781 + OnExecute = FileProp1Execute + OnUpdate = FileProp1Update + end + object DumpPe1: TAction + Caption = 'Dump PE' + Hint = 'Dump PE' + ImageIndex = 22 + ShortCut = 16452 + OnExecute = DumpPe1Execute + OnUpdate = DumpPe1Update + end + end + inherited PopupMenu: TPopupMenu + object Refresh2: TMenuItem + Action = Refresh1 + end + object N1: TMenuItem + Caption = '-' + end + object Copy2: TMenuItem + Action = Copy1 + end + object Selectall2: TMenuItem + Action = SaveToFile1 + end + object N2: TMenuItem + Caption = '-' + end + object Selectall3: TMenuItem + Action = SelectAll1 + end + object DumpPE2: TMenuItem + Action = DumpPe1 + end + object Properties1: TMenuItem + Action = FileProp1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.pas b/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.pas new file mode 100644 index 0000000..1cda690 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ModulesDump.pas @@ -0,0 +1,245 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is ModulesDump.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit ModulesDump; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ViewTemplate, Menus, ActnList, ComCtrls, ToolWin; + +type + TModulesDumpForm = class(TViewForm) + StatusBar: TStatusBar; + ModulesListView: TListView; + ToolButton1: TToolButton; + ToolButton2: TToolButton; + ToolButton3: TToolButton; + ToolButton4: TToolButton; + ToolButton5: TToolButton; + ToolButton6: TToolButton; + Refresh2: TMenuItem; + N1: TMenuItem; + Copy2: TMenuItem; + Selectall2: TMenuItem; + N2: TMenuItem; + Selectall3: TMenuItem; + FileProp1: TAction; + ToolButton7: TToolButton; + ToolButton8: TToolButton; + Properties1: TMenuItem; + DumpPe1: TAction; + ToolButton9: TToolButton; + DumpPE2: TMenuItem; + ToolButton10: TToolButton; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormShow(Sender: TObject); + procedure Refresh1Execute(Sender: TObject); + procedure ModulesListViewColumnClick(Sender: TObject; + Column: TListColumn); + procedure ModulesListViewCompare(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); + procedure FileProp1Update(Sender: TObject); + procedure FileProp1Execute(Sender: TObject); + procedure ModulesListViewInfoTip(Sender: TObject; Item: TListItem; + var InfoTip: String); + procedure DumpPe1Execute(Sender: TObject); + procedure DumpPe1Update(Sender: TObject); + private + function SelectedFileName: TFileName; + public + procedure BuildContent; override; + procedure BuildModulesList; + end; + +var + ModulesDumpForm: TModulesDumpForm; + +implementation + +{$R *.DFM} + +uses + ToolsUtils, TLHelp32, JclShell, Global; + +resourcestring + sModulesCount = 'Modules: %d'; + +procedure TModulesDumpForm.BuildContent; +begin + BuildModulesList; +end; + +procedure TModulesDumpForm.BuildModulesList; +type + TProcessData = packed record + UsageCnt: Word; + RelocateCnt: Word; + end; +var + ML: TStringList; + SnapProcHandle, SnapModuleHandle: THandle; + ProcessEntry: TProcessEntry32; + ModuleEntry: TModuleEntry32; + ProcessNext, ModuleNext: Boolean; + I: Integer; + PD: TProcessData; +begin + ML := TStringList.Create; + Screen.Cursor := crHourGlass; + try + ML.Sorted := True; + ML.Duplicates := dupIgnore; + + SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if SnapProcHandle <> THandle(-1) then + begin + ProcessEntry.dwSize := Sizeof(ProcessEntry); + ProcessNext := Process32First(SnapProcHandle, ProcessEntry); + while ProcessNext do + begin + SnapModuleHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID); + if SnapModuleHandle <> THandle(-1) then + begin + ModuleEntry.dwSize := Sizeof(ModuleEntry); + ModuleNext := Module32First(SnapModuleHandle, ModuleEntry); + while ModuleNext do + begin + I := ML.Add(ModuleEntry.szExePath); + PD := TProcessData(ML.Objects[I]); + Inc(PD.UsageCnt); + if GetImageBase(ModuleEntry.szExePath) <> DWORD(ModuleEntry.modBaseAddr) then + Inc(PD.RelocateCnt); + ML.Objects[I] := Pointer(PD); + ModuleNext := Module32Next(SnapModuleHandle, ModuleEntry); + end; + CloseHandle(SnapModuleHandle); + end; + ProcessNext := Process32Next(SnapProcHandle, ProcessEntry); + end; + CloseHandle(SnapProcHandle); + end; + + with ModulesListView do + begin + Items.BeginUpdate; + Items.Clear; + for I := 0 to ML.Count - 1 do + with Items.Add do + begin + Caption := AnsiLowerCase(ExtractFileName(ML[I])); + PD := TProcessData(ML.Objects[I]); + if PD.RelocateCnt = 0 then + ImageIndex := 20 + else + ImageIndex := 19; + with SubItems do + begin + Add(IntToStr(PD.UsageCnt)); + if PD.RelocateCnt = 0 then Add('-') else Add(IntToStr(PD.RelocateCnt)); + Add(ML[I]); + end; + end; + AlphaSort; + Items.EndUpdate; + end; + + with StatusBar do + begin + Panels.BeginUpdate; + Panels[0].Text := Format(sModulesCount, [ML.Count]); + Panels.EndUpdate; + end; + + finally + ML.Free; + Screen.Cursor := crDefault; + end; +end; + +procedure TModulesDumpForm.FormClose(Sender: TObject; var Action: TCloseAction); +begin + inherited; + ModulesDumpForm := nil; +end; + +procedure TModulesDumpForm.FormShow(Sender: TObject); +begin + inherited; + PostBuildContentMessage; +end; + +function TModulesDumpForm.SelectedFileName: TFileName; +begin + Result := ModulesListView.Selected.SubItems[2]; +end; + +procedure TModulesDumpForm.Refresh1Execute(Sender: TObject); +begin + BuildModulesList; +end; + +procedure TModulesDumpForm.ModulesListViewColumnClick(Sender: TObject; + Column: TListColumn); +begin + LVColumnClick(Column); +end; + +procedure TModulesDumpForm.ModulesListViewCompare(Sender: TObject; Item1, + Item2: TListItem; Data: Integer; var Compare: Integer); +begin + LVCompare(ModulesListView, Item1, Item2, Compare); +end; + +procedure TModulesDumpForm.FileProp1Update(Sender: TObject); +begin + FileProp1.Enabled := Assigned(ModulesListView.Selected); +end; + +procedure TModulesDumpForm.FileProp1Execute(Sender: TObject); +begin + DisplayPropDialog(Application.Handle, SelectedFileName); +end; + +procedure TModulesDumpForm.ModulesListViewInfoTip(Sender: TObject; + Item: TListItem; var InfoTip: String); +begin + InfoTip := InfoTipVersionString(Item.SubItems[2]); +end; + +procedure TModulesDumpForm.DumpPe1Execute(Sender: TObject); +begin + GlobalModule.ViewPE(ModulesListView.Selected.SubItems[2]); +end; + +procedure TModulesDumpForm.DumpPe1Update(Sender: TObject); +begin + DumpPe1.Enabled := GlobalModule.PeViewerRegistred and Assigned(ModulesListView.Selected) +end; + +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dof b/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dof new file mode 100644 index 0000000..229fd00 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dof @@ -0,0 +1,134 @@ +[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= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath=..\..\..\..\source;..\..\..\..\source\common;..\..\..\..\source\windows;..\..\..\..\source\vcl +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=0 +MinorVer=5 +Release=4 +Build=65 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 +[Version Info Keys] +CompanyName=Petr Vones +FileDescription=ToolHelp Viewer for Win95/98/2000 +FileVersion=0.5.4.65 +InternalName=TOOLHELPVIEWER +LegalCopyright=(c) 2002 Petr Vones +LegalTrademarks= +OriginalFilename=TOOLHELPVIEWER.EXE +ProductName=ToolHelp Viewer +ProductVersion=0.5.4 diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dpr b/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dpr new file mode 100644 index 0000000..d220e93 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.dpr @@ -0,0 +1,35 @@ +program ToolHelpViewer; + +{$I jcl.inc} + +uses + Forms, + SysUtils, + JclAppInst, + Main in 'Main.pas' {MainForm}, + ChangePriority in 'ChangePriority.pas' {ChangePriorityDlg}, + HeapDump in 'HeapDump.pas' {HeapDumpForm}, + MemoryDump in 'MemoryDump.pas' {MemoryDumpForm}, + Global in 'Global.pas' {GlobalModule: TDataModule}, + ViewTemplate in 'ViewTemplate.pas' {ViewForm}, + ModulesDump in 'ModulesDump.pas' {ModulesDumpForm}, + ToolsUtils in '..\Common\ToolsUtils.pas', + About in '..\Common\About.pas' {AboutBox}, + FindDlg in '..\Common\FindDlg.pas' {FindForm}, + ExceptDlg in '..\..\..\..\experts\debug\dialog\ExceptDlg.pas' {ExceptionDialog}; + +{$R *.RES} +{$R ..\..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + try + JclAppInstances.CheckSingleInstance; + Application.Initialize; + Application.Title := 'ToolHelp Viewer'; + Application.CreateForm(TGlobalModule, GlobalModule); + Application.CreateForm(TMainForm, MainForm); + Application.Run; + except // fix for Delphi 5's RTL bug + SysUtils.ShowException(ExceptObject, ExceptAddr); + end; +end. diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.res b/official/1.100/examples/windows/delphitools/toolhelpview/ToolHelpViewer.res new file mode 100644 index 0000000000000000000000000000000000000000..12a2ffd1fb9eacbc0d88cdb679d1c64aaf8d0168 GIT binary patch literal 1720 zcmd^;O;1x%5Qg8{A|VoKB6}O-0u8ARDMmH|;UhMwK!kuhLJ*;`v<=i4cl`nWqhiuM z_eZ#J;ZBz>jP;p0_j)fv)Rh}gJNL}@yffz(jNwp2sKWwqkL#kT^}j zl%NGDr=ac;bM@*;{MGA)jV~bU?6N8hK+B)Wy;GdidSrjqJF>cDp!n0{j=!Y z6$4X@pPylLh09SYM`kD5?dFxrK^x0va<9LVL+#X`;0y8prOXjAMW0`o28w2waNg250y)D7}2;d88x_V9m8*Lz3@USxya z@|Hl|#(JPr*Ee;CxTMaq>-W8W2mglqn&TE+8!S)oXi~xQG~nMrmetVNzT?Q}G^+>T zd&GAJl=c(cSf@=c1t(N*QVlY5O*_E_|y5=ySRQS{?`*o h=PxaL)ot%9L7m=0>8{`4Fo70*H}TBgm$Aaf!Vgnm&F}yK literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.dfm b/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.dfm new file mode 100644 index 0000000..9496ff8 --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.dfm @@ -0,0 +1,109 @@ +object ViewForm: TViewForm + Left = 288 + Top = 168 + ClientWidth = 340 + ClientHeight = 284 + BorderStyle = bsSizeToolWin + Caption = 'ViewForm' + Color = clBtnFace + Constraints.MinHeight = 200 + Constraints.MinWidth = 300 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poDefaultPosOnly + ShowHint = True + OnClose = FormClose + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object CoolBar: TCoolBar + Left = 0 + Top = 0 + Width = 340 + Height = 26 + AutoSize = True + Bands = < + item + Control = ToolBar + ImageIndex = -1 + MinHeight = 22 + Width = 336 + end> + PopupMenu = ToolBarPopupMenu + object ToolBar: TToolBar + Left = 9 + Top = 0 + Width = 323 + Height = 22 + AutoSize = True + Caption = 'ToolBar' + EdgeBorders = [] + Flat = True + Images = GlobalModule.ToolbarImagesList + TabOrder = 0 + end + end + object ActionList: TActionList + Images = GlobalModule.ToolbarImagesList + Left = 8 + Top = 224 + object TextLabels1: TAction + Caption = 'Text labels' + OnExecute = TextLabels1Execute + end + object Copy1: TAction + Caption = 'Copy' + Hint = 'Copy to clipboard' + ImageIndex = 9 + ShortCut = 16451 + OnExecute = Copy1Execute + OnUpdate = Copy1Update + end + object SaveToFile1: TAction + Caption = 'Save' + Hint = 'Save to text file' + ImageIndex = 3 + ShortCut = 16467 + OnExecute = SaveToFile1Execute + OnUpdate = Copy1Update + end + object Refresh1: TAction + Caption = 'Refresh' + Hint = 'Refresh the list' + ImageIndex = 2 + ShortCut = 116 + end + object SelectAll1: TAction + Caption = 'Select all' + Hint = 'Select all listview items' + ImageIndex = 17 + ShortCut = 16449 + OnExecute = SelectAll1Execute + OnUpdate = SelectAll1Update + end + object Find1: TAction + Caption = 'Find text' + Hint = 'Find text' + ImageIndex = 7 + ShortCut = 16454 + OnExecute = Find1Execute + OnUpdate = Find1Update + end + end + object PopupMenu: TPopupMenu + Images = GlobalModule.ToolbarImagesList + Left = 40 + Top = 224 + end + object ToolBarPopupMenu: TPopupMenu + Left = 72 + Top = 224 + object Textlabels2: TMenuItem + Action = TextLabels1 + end + end +end diff --git a/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.pas b/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.pas new file mode 100644 index 0000000..d9a10df --- /dev/null +++ b/official/1.100/examples/windows/delphitools/toolhelpview/ViewTemplate.pas @@ -0,0 +1,155 @@ +{**************************************************************************************************} +{ } +{ Project JEDI Code Library (JCL) - Delphi Tools } +{ } +{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } +{ you may not use this file except in compliance with the License. You may obtain a copy of the } +{ License at http://www.mozilla.org/MPL/ } +{ } +{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } +{ ANY KIND, either express or implied. See the License for the specific language governing rights } +{ and limitations under the License. } +{ } +{ The Original Code is ViewTemplate.pas. } +{ } +{ The Initial Developer of the Original Code is Petr Vones. Portions created by Petr Vones are } +{ Copyright (C) of Petr Vones. All Rights Reserved. } +{ } +{ Contributor(s): } +{ } +{**************************************************************************************************} +{ } +{ Last modified: $Date: 2006-05-30 00:02:45 +0200 (mar., 30 mai 2006) $ } +{ } +{**************************************************************************************************} + +unit ViewTemplate; + +{$I JCL.INC} + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ToolWin, ComCtrls, ActnList, Menus; + +const + UM_BUILD = WM_USER + $100; + +type + TViewForm = class(TForm) + CoolBar: TCoolBar; + ToolBar: TToolBar; + ActionList: TActionList; + PopupMenu: TPopupMenu; + TextLabels1: TAction; + ToolBarPopupMenu: TPopupMenu; + Textlabels2: TMenuItem; + Copy1: TAction; + SaveToFile1: TAction; + Refresh1: TAction; + SelectAll1: TAction; + Find1: TAction; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormShow(Sender: TObject); + procedure TextLabels1Execute(Sender: TObject); + procedure SelectAll1Update(Sender: TObject); + procedure SelectAll1Execute(Sender: TObject); + procedure Copy1Update(Sender: TObject); + procedure Copy1Execute(Sender: TObject); + procedure SaveToFile1Execute(Sender: TObject); + procedure Find1Update(Sender: TObject); + procedure Find1Execute(Sender: TObject); + private + procedure UpdateTextLabels; + procedure UMBuild(var Msg: TMessage); message UM_BUILD; + public + procedure BuildContent; dynamic; abstract; + procedure PostBuildContentMessage; + end; + +var + ViewForm: TViewForm; + +implementation + +uses Main, Global, ToolsUtils, About, FindDlg; + +{$R *.DFM} + +procedure TViewForm.FormClose(Sender: TObject; var Action: TCloseAction); +begin + MainForm.DeleteFromViewsMenu(Self); + Action := caFree; +end; + +procedure TViewForm.FormShow(Sender: TObject); +begin + MainForm.AddToViewsMenu(Self, Caption); +end; + +procedure TViewForm.TextLabels1Execute(Sender: TObject); +begin + with TextLabels1 do Checked := not Checked; + UpdateTextLabels; +end; + +procedure TViewForm.UpdateTextLabels; +begin + ToolBar.ShowCaptions := TextLabels1.Checked; + if not ToolBar.ShowCaptions then + begin + ToolBar.ButtonHeight := 0; + ToolBar.ButtonWidth := 0; + end; +end; + +procedure TViewForm.Copy1Update(Sender: TObject); +begin + TAction(Sender).Enabled := ActiveControl is TListView; +end; + +procedure TViewForm.SelectAll1Update(Sender: TObject); +begin + TAction(Sender).Enabled := + (ActiveControl is TListView) and TListView(ActiveControl).MultiSelect; +end; + +procedure TViewForm.SelectAll1Execute(Sender: TObject); +begin + ListViewSelectAll(ActiveControl as TListView); +end; + +procedure TViewForm.Copy1Execute(Sender: TObject); +begin + GlobalModule.ListViewToClipboard(ActiveControl as TListView); +end; + +procedure TViewForm.SaveToFile1Execute(Sender: TObject); +begin + GlobalModule.ListViewToFile(ActiveControl as TListView, Caption); +end; + +procedure TViewForm.UMBuild(var Msg: TMessage); +begin + Update; + BuildContent; +end; + +procedure TViewForm.PostBuildContentMessage; +begin + PostMessage(Handle, UM_BUILD, 0, 0); +end; + +procedure TViewForm.Find1Update(Sender: TObject); +begin + TAction(Sender).Enabled := + (ActiveControl is TListView) and not TListView(ActiveControl).HideSelection; +end; + +procedure TViewForm.Find1Execute(Sender: TObject); +begin + ShowFindDialog(ActiveControl as TListView); +end; + +end. diff --git a/official/1.100/examples/windows/edisdk/Clean.bat b/official/1.100/examples/windows/edisdk/Clean.bat new file mode 100644 index 0000000..2bca898 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/Clean.bat @@ -0,0 +1,18 @@ +@echo off +if exist *.~* del *.~* +if exist *.dcu del *.dcu +if exist *.dpl del *.dpl +if exist *.bpl del *.bpl +if exist *.bpi del *.bpi +if exist *.lsp del *.lsp +if exist *.dcp del *.dcp +if exist *.dpc del *.dpc +if exist *.bak del *.bak +if exist *.obj del *.obj +if exist *.hpp del *.hpp +if exist *.lib del *.lib +if exist *.exe del *.exe +if exist *.dsk del *.dsk + + + diff --git a/official/1.100/examples/windows/edisdk/EDICOMExample.dof b/official/1.100/examples/windows/edisdk/EDICOMExample.dof new file mode 100644 index 0000000..abe45c2 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/EDICOMExample.dof @@ -0,0 +1,2 @@ +[Directories] +OutputDir=..\..\..\bin diff --git a/official/1.100/examples/windows/edisdk/EDICOMExample.dpr b/official/1.100/examples/windows/edisdk/EDICOMExample.dpr new file mode 100644 index 0000000..0ba1c24 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/EDICOMExample.dpr @@ -0,0 +1,16 @@ +program EDICOMExample; + +{$I jcl.inc} + +uses + Forms, + EDICOMExampleMain in 'EDICOMExampleMain.pas' {Form1}; + +{$R *.RES} +{$R ..\..\..\source\windows\JclCommCtrlAsInvoker.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/official/1.100/examples/windows/edisdk/EDICOMExample.res b/official/1.100/examples/windows/edisdk/EDICOMExample.res new file mode 100644 index 0000000000000000000000000000000000000000..55f874204136d6cde31b105890029f4503c878e3 GIT binary patch literal 876 zcmaJ=Jxc>Y5Pj=~TWm~%7FH&uWyHcFg^CccPz(RS*=&<05J-d+UUf~tKNE-t+g#=E zNNH(l5wgCWy~_uF40${AX5Q>hmRkU56V3%N+_8_nsvc3Jq}FKc*DBE|gEnzRD3odT z{B9}0AJQ~9t_+D3MNzQehw#n?$2H95lfjzJMiq+xpGS}RU|YW7TGAUn=>TJR9vbuv zQKv^fLP$_BH=di&s%NpygeRq7WOL!AU~H`oJdv~Xnj7J9-%dk4aAV5-jBGG4rXS8T z#&1Awg!ePy@tV(f_@tlj=qJ`@+x_IZ=P3K1ZEocskt@zKp3bKiEbG`L>hS!nd7PP< z*YiLohG%h>ba`1aP@aA!Bu=2+E0lZZSF-?KK7q>;Epm@~@dtdZ0(&$OeF0BP;A;i7bZNA5i@Ni6 j1fWAWcYr%w;}-YC4Ibz#+kO}RH7K;(HF*{O6)AiJ<8sA5 literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/edisdk/EDICOMExampleMain.dfm b/official/1.100/examples/windows/edisdk/EDICOMExampleMain.dfm new file mode 100644 index 0000000..ac5e7df --- /dev/null +++ b/official/1.100/examples/windows/edisdk/EDICOMExampleMain.dfm @@ -0,0 +1,50 @@ +object Form1: TForm1 + Left = 192 + Top = 107 + ClientWidth = 688 + ClientHeight = 454 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 32 + Top = 4 + Width = 75 + Height = 25 + Caption = 'Button1' + TabOrder = 0 + OnClick = Button1Click + end + object Memo1: TMemo + Left = 0 + Top = 36 + Width = 688 + Height = 417 + Anchors = [akLeft, akTop, akRight, akBottom] + Lines.Strings = ( + 'Memo1') + TabOrder = 1 + end + object Button2: TButton + Left = 120 + Top = 4 + Width = 75 + Height = 25 + Caption = 'Button2' + TabOrder = 2 + OnClick = Button2Click + end + object F: TEDICOMFile + AutoConnect = False + ConnectKind = ckRunningOrNew + Left = 64 + Top = 32 + end +end diff --git a/official/1.100/examples/windows/edisdk/EDICOMExampleMain.pas b/official/1.100/examples/windows/edisdk/EDICOMExampleMain.pas new file mode 100644 index 0000000..48cfdec --- /dev/null +++ b/official/1.100/examples/windows/edisdk/EDICOMExampleMain.pas @@ -0,0 +1,157 @@ +unit EDICOMExampleMain; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, OleServer, EDISDK_TLB; + +type + TForm1 = class(TForm) + F: TEDICOMFile; + Button1: TButton; + Memo1: TMemo; + Button2: TButton; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +procedure TForm1.Button1Click(Sender: TObject); +var + I: Integer; +begin + F.Options := 0; + F.Options := F.Options or foVariableDelimiterDetection; + F.Options := F.Options or foUseAltDelimiterDetection; + F.Options := F.Options or foRemoveCrLf; + F.Options := F.Options or foRemoveCr; + F.Options := F.Options or foRemoveLf; + F.Options := F.Options or foIgnoreGarbageAtEndOfFile; + F.LoadFromFile(ExtractFileDir(Application.ExeName) + '\sample.edi'); + Memo1.Lines.Add( F.Data ); + F.Disassemble; + Memo1.Lines.Add(F.Interchange[0].SegmentISA.SegmentId); + Memo1.Lines.Add(F.Interchange[0].FunctionalGroup[0].SegmentGS.SegmentId); + Memo1.Lines.Add(F.Interchange[0].FunctionalGroup[0].TransactionSet[0].SegmentST.SegmentId); + for I := 0 to F.Interchange[0].FunctionalGroup[0].TransactionSet[0].SegmentCount - 1 do + begin + F.Interchange[0].FunctionalGroup[0].TransactionSet[0].Segment[I].Assemble; + Memo1.Lines.Add( F.Interchange[0].FunctionalGroup[0].TransactionSet[0].Segment[I].Data ); + end; + Memo1.Lines.Add(F.Interchange[0].FunctionalGroup[0].TransactionSet[0].Segment[0].Data); + Memo1.Lines.Add(F.Interchange[0].FunctionalGroup[0].TransactionSet[0].SegmentSE.SegmentId); + Memo1.Lines.Add(F.Interchange[0].FunctionalGroup[0].SegmentGE.SegmentId); + Memo1.Lines.Add(F.Interchange[0].SegmentIEA.SegmentId); +end; + +procedure TForm1.Button2Click(Sender: TObject); +var + C: IEDICOMFile; + I, F, T, S: Integer; +begin + Memo1.Lines.Clear; + + C := CoEDICOMFile.Create; + I := C.AddInterchange; + C.Interchange[I].SetDelimiters('~' + #13#10, '*', '>'); + with C.Interchange[I].SegmentISA do + begin + SegmentId := 'ISA'; + DeleteElements; + AddElements(17); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + Element[2].Data := 'data'; + Element[3].Data := 'data'; + Element[4].Data := 'data'; + Element[5].Data := 'data'; + Element[6].Data := 'data'; + Element[7].Data := 'data'; + Element[8].Data := 'data'; + Element[9].Data := 'data'; + Element[10].Data := 'data'; + Element[11].Data := 'data'; + Element[12].Data := 'data'; + Element[13].Data := 'data'; + Element[14].Data := 'data'; + Element[15].Data := 'data'; + Element[16].Data := C.Interchange[I].Delimiters.SS; + end; + + F := C.Interchange[I].AddFunctionalGroup; + with C.Interchange[I].FunctionalGroup[F].SegmentGS do + begin + SegmentId := 'GS'; + DeleteElements; + AddElements(8); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + Element[2].Data := 'data'; + Element[3].Data := 'data'; + Element[4].Data := 'data'; + Element[5].Data := 'data'; + Element[6].Data := 'data'; + Element[7].Data := 'data'; + end; + + T := C.Interchange[I].FunctionalGroup[F].AddTransactionSet; + with C.Interchange[I].FunctionalGroup[F].TransactionSet[T].SegmentST do + begin + SegmentId := 'ST'; + DeleteElements; + AddElements(2); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + end; + + S := C.Interchange[I].FunctionalGroup[F].TransactionSet[T].AddSegment; + with C.Interchange[I].FunctionalGroup[F].TransactionSet[T].Segment[S] do + begin + SegmentId := 'TST'; + AddElements(2); + Element[0].Data := 'data 1'; + Element[1].Data := 'data 2'; + end; + + with C.Interchange[I].FunctionalGroup[F].TransactionSet[T].SegmentSE do + begin + SegmentId := 'SE'; + DeleteElements; + AddElements(2); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + end; + + with C.Interchange[I].FunctionalGroup[F].SegmentGE do + begin + SegmentId := 'GE'; + DeleteElements; + AddElements(2); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + end; + + with C.Interchange[I].SegmentIEA do + begin + SegmentId := 'IEA'; + DeleteElements; + AddElements(2); + Element[0].Data := 'data'; + Element[1].Data := 'data'; + end; + + Memo1.Lines.Add( C.Assemble ); +end; + +end. diff --git a/official/1.100/examples/windows/edisdk/EDISDK_TLB.dcr b/official/1.100/examples/windows/edisdk/EDISDK_TLB.dcr new file mode 100644 index 0000000000000000000000000000000000000000..4961f7d1c6912782561e3d71e9f346f29de7f8e1 GIT binary patch literal 3338 zcmbuBeN5F=7{|W}F3fx@H5&iOpg zbDrn?egN<))zf2%-Cm#Ho(Cp!q^D;95-=4X;3G^y9A;t~dowsqT$;#XN&8AsGGZF;PR-k2QYZW3LraMjrCWg0Kr1@o{m>hRfVNHb{M@|Q30%9@6Y;ztd9keu|J@- zweyMmvSV?%xfuzYH~R^D_Q0!k?1!yIMMdpXv6R`>)rCu!E}?M$e$33z_X;H?=%tu7 zUf!*nH&K$B+Dpx~k7vtYXU^cg!-s)$=PaE*4Xj!P6#Rjtj2$RFbPmnU9Vm*6!zTS!%HqsMvw%-rE80edWDLm z1|UOb;Tw6$8ebHQA7f$yVy51^*W17Qy!rEYBIV~4q)D2oYprcz-z83@%6N=p`ld+& z$3_`H^FMSVko{cN+KNe6uNpCtfWkuKUsRNMIm)sXFY&A$>zGKBapcXW-r#;R)tFCq z4fNMuyLJuVGG9K^oY6hJas~KYFlLeRvtYH+`0uYfBNz= zB@;7bhGB+FIOfSbjF1s{nat6YGr)K%PwW5S!Gjp0^}ydaaRP7)LMARjUS2U;T3U>c z%A79K5zKs@BXbZcpp&Jt#|6U0sblp5tGiJZbr;F`X=!Ia@F`>oufEis2zoMA`wp_bi_%kOPUuk}G?syTD zmzO`X25md;GB)~tV0iQw#l^s|d0ZhkLZ4mcRd{-4D|SUBjNM zJk1;COhm+HKj!PUU-$3NVy?B5Z~I}^*~FaEHTqLQf%OijYwX@_Jrfs`H_M-=>w0a| zKI8x0#*JvB&E9K_8MbYEFfTXPdZ)1KP}kVI*W4RHUv0a6+qr#w#M-s+tXyg0nSS=H zWzY5N;34L(W5>+(a9&SmzJ+p+jQz~p{&=nArS)ZQ*}`2hH{{RhZmCpbG literal 0 HcmV?d00001 diff --git a/official/1.100/examples/windows/edisdk/EDISDK_TLB.pas b/official/1.100/examples/windows/edisdk/EDISDK_TLB.pas new file mode 100644 index 0000000..b2ea6d5 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/EDISDK_TLB.pas @@ -0,0 +1,1021 @@ +unit EDISDK_TLB; + +// ************************************************************************ // +// WARNING +// ------- +// The types declared in this file were generated from data read from a +// Type Library. If this type library is explicitly or indirectly (via +// another type library referring to this type library) re-imported, or the +// 'Refresh' command of the Type Library Editor activated while editing the +// Type Library, the contents of this file will be regenerated and all +// manual modifications will be lost. +// ************************************************************************ // + +// PASTLWTR : $Revision: 1658 $ +// File generated on 17.7.2004 03:10:43 from Type Library described below. + +// *************************************************************************// +// NOTE: +// Items guarded by $IFDEF_LIVE_SERVER_AT_DESIGN_TIME are used by properties +// which return objects that may need to be explicitly created via a function +// call prior to any access via the property. These items have been disabled +// in order to prevent accidental use from within the object inspector. You +// may enable them by defining LIVE_SERVER_AT_DESIGN_TIME or by selectively +// removing them from the $IFDEF blocks. However, such items must still be +// programmatically created via a method of the appropriate CoClass before +// they can be used. +// ************************************************************************ // +// Type Lib: I:\Quellen\jedi\jcl\examples\vcl\edisdk\comserver\EDISDK.dll (1) +// IID\LCID: {AF3BB992-62DF-41B7-92C7-FA41BDBB427E}\0 +// Helpfile: +// DepndLst: +// (1) v2.0 stdole, (F:\WINNT\system32\STDOLE2.TLB) +// (2) v4.0 StdVCL, (F:\WINNT\system32\STDVCL40.DLL) +// ************************************************************************ // +{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. +interface + +uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL; + +// *********************************************************************// +// GUIDS declared in the TypeLibrary. Following prefixes are used: +// Type Libraries : LIBID_xxxx +// CoClasses : CLASS_xxxx +// DISPInterfaces : DIID_xxxx +// Non-DISP interfaces: IID_xxxx +// *********************************************************************// +const + // TypeLibrary Major and minor versions + EDISDKMajorVersion = 1; + EDISDKMinorVersion = 0; + + LIBID_EDISDK: TGUID = '{AF3BB992-62DF-41B7-92C7-FA41BDBB427E}'; + + IID_IEDICOMDelimiters: TGUID = '{A0181BBD-2F88-4FDC-9752-8303519D2D62}'; + CLASS_EDICOMDelimiters: TGUID = '{30B8A020-5D35-4ED8-B889-C13F309AE308}'; + IID_IEDICOMDataObject: TGUID = '{C7037767-05C8-4C6F-8201-655A6B5A4CF4}'; + IID_IEDICOMDataObjectGroup: TGUID = '{AEADBE04-6D1C-493E-BE6B-51E96BAD3680}'; + IID_IEDICOMElement: TGUID = '{E4ED3376-38AA-423C-9160-AAD190ACCB35}'; + CLASS_EDICOMElement: TGUID = '{4EFCADAA-60D0-4D61-875C-A27D6BCE932B}'; + IID_IEDICOMSegment: TGUID = '{467C692E-C22F-44B5-ACDB-C7A337B68675}'; + CLASS_EDICOMSegment: TGUID = '{63946EB6-DBDF-44FB-AAA4-123E7C2275B6}'; + IID_IEDICOMTransactionSet: TGUID = '{B2300104-4FF0-40A3-ABED-29E2A36C1844}'; + CLASS_EDICOMTransactionSet: TGUID = '{B540FDFC-B0D0-4E74-A7F4-B09DC260E656}'; + IID_IEDICOMFunctionalGroup: TGUID = '{C2FDB4EF-6252-4E67-BAD4-E7200B9CEA31}'; + CLASS_EDICOMFunctionalGroup: TGUID = '{C69EA833-88BF-4D55-AFC0-264F1B7ED54C}'; + IID_IEDICOMInterchangeControl: TGUID = '{B7FF3E84-8D1E-44F5-BC6A-578881CF7B5A}'; + CLASS_EDICOMInterchangeControl: TGUID = '{EF07065C-6E35-41B6-9564-D2D5714600A8}'; + IID_IEDICOMFile: TGUID = '{DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F}'; + CLASS_EDICOMFile: TGUID = '{E8400822-5701-4226-8F78-A784B3777CB9}'; + +// *********************************************************************// +// Declaration of Enumerations defined in Type Library +// *********************************************************************// +// Constants for enum EDICOMDataObjectDataState +type + EDICOMDataObjectDataState = TOleEnum; +const + ediCreated = $00000000; + ediAssembled = $00000001; + ediDisassembled = $00000002; + +// Constants for enum EDIFileOptions +type + EDIFileOptions = TOleEnum; +const + foNone = $00000000; + foVariableDelimiterDetection = $00000001; + foUseAltDelimiterDetection = $00000002; + foRemoveCrLf = $00000004; + foRemoveCr = $00000008; + foRemoveLf = $00000010; + foIgnoreGarbageAtEndOfFile = $00000020; + +type + +// *********************************************************************// +// Forward declaration of types defined in TypeLibrary +// *********************************************************************// + IEDICOMDelimiters = interface; + IEDICOMDelimitersDisp = dispinterface; + IEDICOMDataObject = interface; + IEDICOMDataObjectDisp = dispinterface; + IEDICOMDataObjectGroup = interface; + IEDICOMDataObjectGroupDisp = dispinterface; + IEDICOMElement = interface; + IEDICOMElementDisp = dispinterface; + IEDICOMSegment = interface; + IEDICOMSegmentDisp = dispinterface; + IEDICOMTransactionSet = interface; + IEDICOMTransactionSetDisp = dispinterface; + IEDICOMFunctionalGroup = interface; + IEDICOMFunctionalGroupDisp = dispinterface; + IEDICOMInterchangeControl = interface; + IEDICOMInterchangeControlDisp = dispinterface; + IEDICOMFile = interface; + IEDICOMFileDisp = dispinterface; + +// *********************************************************************// +// Declaration of CoClasses defined in Type Library +// (NOTE: Here we map each CoClass to its Default Interface) +// *********************************************************************// + EDICOMDelimiters = IEDICOMDelimiters; + EDICOMElement = IEDICOMElement; + EDICOMSegment = IEDICOMSegment; + EDICOMTransactionSet = IEDICOMTransactionSet; + EDICOMFunctionalGroup = IEDICOMFunctionalGroup; + EDICOMInterchangeControl = IEDICOMInterchangeControl; + EDICOMFile = IEDICOMFile; + + +// *********************************************************************// +// Interface: IEDICOMDelimiters +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {A0181BBD-2F88-4FDC-9752-8303519D2D62} +// *********************************************************************// + IEDICOMDelimiters = interface(IDispatch) + ['{A0181BBD-2F88-4FDC-9752-8303519D2D62}'] + function Get_SD: WideString; safecall; + procedure Set_SD(const Value: WideString); safecall; + function Get_ED: WideString; safecall; + procedure Set_ED(const Value: WideString); safecall; + function Get_SS: WideString; safecall; + procedure Set_SS(const Value: WideString); safecall; + function Get_SDLen: Integer; safecall; + function Get_EDLen: Integer; safecall; + function Get_SSLen: Integer; safecall; + property SD: WideString read Get_SD write Set_SD; + property ED: WideString read Get_ED write Set_ED; + property SS: WideString read Get_SS write Set_SS; + property SDLen: Integer read Get_SDLen; + property EDLen: Integer read Get_EDLen; + property SSLen: Integer read Get_SSLen; + end; + +// *********************************************************************// +// DispIntf: IEDICOMDelimitersDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {A0181BBD-2F88-4FDC-9752-8303519D2D62} +// *********************************************************************// + IEDICOMDelimitersDisp = dispinterface + ['{A0181BBD-2F88-4FDC-9752-8303519D2D62}'] + property SD: WideString dispid 201; + property ED: WideString dispid 202; + property SS: WideString dispid 203; + property SDLen: Integer readonly dispid 204; + property EDLen: Integer readonly dispid 205; + property SSLen: Integer readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMDataObject +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {C7037767-05C8-4C6F-8201-655A6B5A4CF4} +// *********************************************************************// + IEDICOMDataObject = interface(IDispatch) + ['{C7037767-05C8-4C6F-8201-655A6B5A4CF4}'] + function Assemble: WideString; safecall; + procedure Disassemble; safecall; + function Get_State: Integer; safecall; + function Get_Data: WideString; safecall; + procedure Set_Data(const Value: WideString); safecall; + function Get_DataLength: Integer; safecall; + function Get_Delimiters: IEDICOMDelimiters; safecall; + property State: Integer read Get_State; + property Data: WideString read Get_Data write Set_Data; + property DataLength: Integer read Get_DataLength; + property Delimiters: IEDICOMDelimiters read Get_Delimiters; + end; + +// *********************************************************************// +// DispIntf: IEDICOMDataObjectDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {C7037767-05C8-4C6F-8201-655A6B5A4CF4} +// *********************************************************************// + IEDICOMDataObjectDisp = dispinterface + ['{C7037767-05C8-4C6F-8201-655A6B5A4CF4}'] + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMDataObjectGroup +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {AEADBE04-6D1C-493E-BE6B-51E96BAD3680} +// *********************************************************************// + IEDICOMDataObjectGroup = interface(IEDICOMDataObject) + ['{AEADBE04-6D1C-493E-BE6B-51E96BAD3680}'] + end; + +// *********************************************************************// +// DispIntf: IEDICOMDataObjectGroupDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {AEADBE04-6D1C-493E-BE6B-51E96BAD3680} +// *********************************************************************// + IEDICOMDataObjectGroupDisp = dispinterface + ['{AEADBE04-6D1C-493E-BE6B-51E96BAD3680}'] + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMElement +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {E4ED3376-38AA-423C-9160-AAD190ACCB35} +// *********************************************************************// + IEDICOMElement = interface(IEDICOMDataObject) + ['{E4ED3376-38AA-423C-9160-AAD190ACCB35}'] + end; + +// *********************************************************************// +// DispIntf: IEDICOMElementDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {E4ED3376-38AA-423C-9160-AAD190ACCB35} +// *********************************************************************// + IEDICOMElementDisp = dispinterface + ['{E4ED3376-38AA-423C-9160-AAD190ACCB35}'] + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMSegment +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {467C692E-C22F-44B5-ACDB-C7A337B68675} +// *********************************************************************// + IEDICOMSegment = interface(IEDICOMDataObjectGroup) + ['{467C692E-C22F-44B5-ACDB-C7A337B68675}'] + function Get_Element(Index: Integer): IEDICOMElement; safecall; + function Get_SegmentId: WideString; safecall; + procedure Set_SegmentId(const Value: WideString); safecall; + function AddElement: Integer; safecall; + function InsertElement(InsertIndex: Integer): Integer; safecall; + procedure DeleteElement(Index: Integer); safecall; + function AddElements(Count: Integer): Integer; safecall; + function InsertElements(InsertIndex: Integer; Count: Integer): Integer; safecall; + procedure DeleteElements; safecall; + function Get_ElementCount: Integer; safecall; + property Element[Index: Integer]: IEDICOMElement read Get_Element; + property SegmentId: WideString read Get_SegmentId write Set_SegmentId; + property ElementCount: Integer read Get_ElementCount; + end; + +// *********************************************************************// +// DispIntf: IEDICOMSegmentDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {467C692E-C22F-44B5-ACDB-C7A337B68675} +// *********************************************************************// + IEDICOMSegmentDisp = dispinterface + ['{467C692E-C22F-44B5-ACDB-C7A337B68675}'] + property Element[Index: Integer]: IEDICOMElement readonly dispid 401; + property SegmentId: WideString dispid 402; + function AddElement: Integer; dispid 403; + function InsertElement(InsertIndex: Integer): Integer; dispid 404; + procedure DeleteElement(Index: Integer); dispid 405; + function AddElements(Count: Integer): Integer; dispid 406; + function InsertElements(InsertIndex: Integer; Count: Integer): Integer; dispid 407; + procedure DeleteElements; dispid 408; + property ElementCount: Integer readonly dispid 409; + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMTransactionSet +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {B2300104-4FF0-40A3-ABED-29E2A36C1844} +// *********************************************************************// + IEDICOMTransactionSet = interface(IEDICOMDataObjectGroup) + ['{B2300104-4FF0-40A3-ABED-29E2A36C1844}'] + function Get_SegmentST: IEDICOMSegment; safecall; + function Get_SegmentSE: IEDICOMSegment; safecall; + function Get_Segment(Index: Integer): IEDICOMSegment; safecall; + function AddSegment: Integer; safecall; + function InsertSegment(InsertIndex: Integer): Integer; safecall; + procedure DeleteSegment(Index: Integer); safecall; + function AddSegments(Count: Integer): Integer; safecall; + function InsertSegments(InsertIndex: Integer; Count: Integer): Integer; safecall; + procedure DeleteSegments; safecall; + function Get_SegmentCount: Integer; safecall; + property SegmentST: IEDICOMSegment read Get_SegmentST; + property SegmentSE: IEDICOMSegment read Get_SegmentSE; + property Segment[Index: Integer]: IEDICOMSegment read Get_Segment; + property SegmentCount: Integer read Get_SegmentCount; + end; + +// *********************************************************************// +// DispIntf: IEDICOMTransactionSetDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {B2300104-4FF0-40A3-ABED-29E2A36C1844} +// *********************************************************************// + IEDICOMTransactionSetDisp = dispinterface + ['{B2300104-4FF0-40A3-ABED-29E2A36C1844}'] + property SegmentST: IEDICOMSegment readonly dispid 401; + property SegmentSE: IEDICOMSegment readonly dispid 402; + property Segment[Index: Integer]: IEDICOMSegment readonly dispid 403; + function AddSegment: Integer; dispid 404; + function InsertSegment(InsertIndex: Integer): Integer; dispid 405; + procedure DeleteSegment(Index: Integer); dispid 406; + function AddSegments(Count: Integer): Integer; dispid 407; + function InsertSegments(InsertIndex: Integer; Count: Integer): Integer; dispid 408; + procedure DeleteSegments; dispid 409; + property SegmentCount: Integer readonly dispid 410; + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMFunctionalGroup +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {C2FDB4EF-6252-4E67-BAD4-E7200B9CEA31} +// *********************************************************************// + IEDICOMFunctionalGroup = interface(IEDICOMDataObjectGroup) + ['{C2FDB4EF-6252-4E67-BAD4-E7200B9CEA31}'] + function Get_SegmentGS: IEDICOMSegment; safecall; + function Get_SegmentGE: IEDICOMSegment; safecall; + function Get_TransactionSet(Index: Integer): IEDICOMTransactionSet; safecall; + function AddTransactionSet: Integer; safecall; + function InsertTransactionSet(InsertIndex: Integer): Integer; safecall; + procedure DeleteTransactionSet(Index: Integer); safecall; + function AddTransactionSets(Count: Integer): Integer; safecall; + function InsertTransactionSets(InsertIndex: Integer; Count: Integer): Integer; safecall; + procedure DeleteTransactionSets; safecall; + function Get_TransactionSetCount: Integer; safecall; + property SegmentGS: IEDICOMSegment read Get_SegmentGS; + property SegmentGE: IEDICOMSegment read Get_SegmentGE; + property TransactionSet[Index: Integer]: IEDICOMTransactionSet read Get_TransactionSet; + property TransactionSetCount: Integer read Get_TransactionSetCount; + end; + +// *********************************************************************// +// DispIntf: IEDICOMFunctionalGroupDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {C2FDB4EF-6252-4E67-BAD4-E7200B9CEA31} +// *********************************************************************// + IEDICOMFunctionalGroupDisp = dispinterface + ['{C2FDB4EF-6252-4E67-BAD4-E7200B9CEA31}'] + property SegmentGS: IEDICOMSegment readonly dispid 401; + property SegmentGE: IEDICOMSegment readonly dispid 402; + property TransactionSet[Index: Integer]: IEDICOMTransactionSet readonly dispid 403; + function AddTransactionSet: Integer; dispid 404; + function InsertTransactionSet(InsertIndex: Integer): Integer; dispid 405; + procedure DeleteTransactionSet(Index: Integer); dispid 406; + function AddTransactionSets(Count: Integer): Integer; dispid 407; + function InsertTransactionSets(InsertIndex: Integer; Count: Integer): Integer; dispid 408; + procedure DeleteTransactionSets; dispid 409; + property TransactionSetCount: Integer readonly dispid 410; + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMInterchangeControl +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {B7FF3E84-8D1E-44F5-BC6A-578881CF7B5A} +// *********************************************************************// + IEDICOMInterchangeControl = interface(IEDICOMDataObjectGroup) + ['{B7FF3E84-8D1E-44F5-BC6A-578881CF7B5A}'] + function Get_SegmentISA: IEDICOMSegment; safecall; + function Get_SegmentIEA: IEDICOMSegment; safecall; + function Get_FunctionalGroup(Index: Integer): IEDICOMFunctionalGroup; safecall; + function AddFunctionalGroup: Integer; safecall; + function InsertFunctionalGroup(InsertIndex: Integer): Integer; safecall; + procedure DeleteFunctionalGroup(Index: Integer); safecall; + function AddFunctionalGroups(InsertIndex: Integer): Integer; safecall; + function InsertFunctionalGroups(InsertIndex: Integer; Count: Integer): Integer; safecall; + procedure DeleteFunctionalGroups; safecall; + procedure SetDelimiters(const SD: WideString; const ED: WideString; const SS: WideString); safecall; + function Get_FunctionalGroupCount: Integer; safecall; + property SegmentISA: IEDICOMSegment read Get_SegmentISA; + property SegmentIEA: IEDICOMSegment read Get_SegmentIEA; + property FunctionalGroup[Index: Integer]: IEDICOMFunctionalGroup read Get_FunctionalGroup; + property FunctionalGroupCount: Integer read Get_FunctionalGroupCount; + end; + +// *********************************************************************// +// DispIntf: IEDICOMInterchangeControlDisp +// Flags: (4432) Hidden Dual OleAutomation Dispatchable +// GUID: {B7FF3E84-8D1E-44F5-BC6A-578881CF7B5A} +// *********************************************************************// + IEDICOMInterchangeControlDisp = dispinterface + ['{B7FF3E84-8D1E-44F5-BC6A-578881CF7B5A}'] + property SegmentISA: IEDICOMSegment readonly dispid 401; + property SegmentIEA: IEDICOMSegment readonly dispid 402; + property FunctionalGroup[Index: Integer]: IEDICOMFunctionalGroup readonly dispid 403; + function AddFunctionalGroup: Integer; dispid 404; + function InsertFunctionalGroup(InsertIndex: Integer): Integer; dispid 405; + procedure DeleteFunctionalGroup(Index: Integer); dispid 406; + function AddFunctionalGroups(InsertIndex: Integer): Integer; dispid 407; + function InsertFunctionalGroups(InsertIndex: Integer; Count: Integer): Integer; dispid 408; + procedure DeleteFunctionalGroups; dispid 409; + procedure SetDelimiters(const SD: WideString; const ED: WideString; const SS: WideString); dispid 410; + property FunctionalGroupCount: Integer readonly dispid 411; + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// Interface: IEDICOMFile +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F} +// *********************************************************************// + IEDICOMFile = interface(IEDICOMDataObjectGroup) + ['{DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F}'] + procedure LoadFromFile(const FileName: WideString); safecall; + procedure ReLoadFromFile; safecall; + procedure SaveToFile; safecall; + procedure SaveAsToFile(const FileName: WideString); safecall; + function Get_FileName: WideString; safecall; + procedure Set_FileName(const Value: WideString); safecall; + function Get_Interchange(Index: Integer): IEDICOMInterchangeControl; safecall; + function Get_Options: Byte; safecall; + procedure Set_Options(Value: Byte); safecall; + function AddInterchange: Integer; safecall; + function InsertInterchange(InsertIndex: Integer): Integer; safecall; + procedure DeleteInterchange(Index: Integer); safecall; + function AddInterchanges(Count: Integer): Integer; safecall; + function InsertInterchanges(InsertIndex: Integer; Count: Integer): Integer; safecall; + procedure DeleteInterchanges; safecall; + function Get_InterchangeCount: Integer; safecall; + property FileName: WideString read Get_FileName write Set_FileName; + property Interchange[Index: Integer]: IEDICOMInterchangeControl read Get_Interchange; + property Options: Byte read Get_Options write Set_Options; + property InterchangeCount: Integer read Get_InterchangeCount; + end; + +// *********************************************************************// +// DispIntf: IEDICOMFileDisp +// Flags: (4416) Dual OleAutomation Dispatchable +// GUID: {DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F} +// *********************************************************************// + IEDICOMFileDisp = dispinterface + ['{DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F}'] + procedure LoadFromFile(const FileName: WideString); dispid 401; + procedure ReLoadFromFile; dispid 402; + procedure SaveToFile; dispid 403; + procedure SaveAsToFile(const FileName: WideString); dispid 404; + property FileName: WideString dispid 405; + property Interchange[Index: Integer]: IEDICOMInterchangeControl readonly dispid 406; + property Options: Byte dispid 407; + function AddInterchange: Integer; dispid 408; + function InsertInterchange(InsertIndex: Integer): Integer; dispid 409; + procedure DeleteInterchange(Index: Integer); dispid 410; + function AddInterchanges(Count: Integer): Integer; dispid 411; + function InsertInterchanges(InsertIndex: Integer; Count: Integer): Integer; dispid 412; + procedure DeleteInterchanges; dispid 413; + property InterchangeCount: Integer readonly dispid 414; + function Assemble: WideString; dispid 201; + procedure Disassemble; dispid 202; + property State: Integer readonly dispid 203; + property Data: WideString dispid 205; + property DataLength: Integer readonly dispid 204; + property Delimiters: IEDICOMDelimiters readonly dispid 206; + end; + +// *********************************************************************// +// The Class CoEDICOMDelimiters provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMDelimiters exposed by +// the CoClass EDICOMDelimiters. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMDelimiters = class + class function Create: IEDICOMDelimiters; + class function CreateRemote(const MachineName: string): IEDICOMDelimiters; + end; + +// *********************************************************************// +// The Class CoEDICOMElement provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMElement exposed by +// the CoClass EDICOMElement. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMElement = class + class function Create: IEDICOMElement; + class function CreateRemote(const MachineName: string): IEDICOMElement; + end; + +// *********************************************************************// +// The Class CoEDICOMSegment provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMSegment exposed by +// the CoClass EDICOMSegment. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMSegment = class + class function Create: IEDICOMSegment; + class function CreateRemote(const MachineName: string): IEDICOMSegment; + end; + +// *********************************************************************// +// The Class CoEDICOMTransactionSet provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMTransactionSet exposed by +// the CoClass EDICOMTransactionSet. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMTransactionSet = class + class function Create: IEDICOMTransactionSet; + class function CreateRemote(const MachineName: string): IEDICOMTransactionSet; + end; + +// *********************************************************************// +// The Class CoEDICOMFunctionalGroup provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMFunctionalGroup exposed by +// the CoClass EDICOMFunctionalGroup. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMFunctionalGroup = class + class function Create: IEDICOMFunctionalGroup; + class function CreateRemote(const MachineName: string): IEDICOMFunctionalGroup; + end; + +// *********************************************************************// +// The Class CoEDICOMInterchangeControl provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMInterchangeControl exposed by +// the CoClass EDICOMInterchangeControl. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMInterchangeControl = class + class function Create: IEDICOMInterchangeControl; + class function CreateRemote(const MachineName: string): IEDICOMInterchangeControl; + end; + +// *********************************************************************// +// The Class CoEDICOMFile provides a Create and CreateRemote method to +// create instances of the default interface IEDICOMFile exposed by +// the CoClass EDICOMFile. The functions are intended to be used by +// clients wishing to automate the CoClass objects exposed by the +// server of this typelibrary. +// *********************************************************************// + CoEDICOMFile = class + class function Create: IEDICOMFile; + class function CreateRemote(const MachineName: string): IEDICOMFile; + end; + + +// *********************************************************************// +// OLE Server Proxy class declaration +// Server Object : TEDICOMFile +// Help String : +// Default Interface: IEDICOMFile +// Def. Intf. DISP? : No +// Event Interface: +// TypeFlags : (2) CanCreate +// *********************************************************************// +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + TEDICOMFileProperties= class; +{$ENDIF} + TEDICOMFile = class(TOleServer) + private + FIntf: IEDICOMFile; +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps: TEDICOMFileProperties; + function GetServerProperties: TEDICOMFileProperties; +{$ENDIF} + function GetDefaultInterface: IEDICOMFile; + protected + procedure InitServerData; override; + function Get_State: Integer; + function Get_Data: WideString; + procedure Set_Data(const Value: WideString); + function Get_DataLength: Integer; + function Get_Delimiters: IEDICOMDelimiters; + function Get_FileName: WideString; + procedure Set_FileName(const Value: WideString); + function Get_Interchange(Index: Integer): IEDICOMInterchangeControl; + function Get_Options: Byte; + procedure Set_Options(Value: Byte); + function Get_InterchangeCount: Integer; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Connect; override; + procedure ConnectTo(svrIntf: IEDICOMFile); + procedure Disconnect; override; + function Assemble: WideString; + procedure Disassemble; + procedure LoadFromFile(const FileName: WideString); + procedure ReLoadFromFile; + procedure SaveToFile; + procedure SaveAsToFile(const FileName: WideString); + function AddInterchange: Integer; + function InsertInterchange(InsertIndex: Integer): Integer; + procedure DeleteInterchange(Index: Integer); + function AddInterchanges(Count: Integer): Integer; + function InsertInterchanges(InsertIndex: Integer; Count: Integer): Integer; + procedure DeleteInterchanges; + property DefaultInterface: IEDICOMFile read GetDefaultInterface; + property State: Integer read Get_State; + property DataLength: Integer read Get_DataLength; + property Delimiters: IEDICOMDelimiters read Get_Delimiters; + property Interchange[Index: Integer]: IEDICOMInterchangeControl read Get_Interchange; + property InterchangeCount: Integer read Get_InterchangeCount; + property Data: WideString read Get_Data write Set_Data; + property FileName: WideString read Get_FileName write Set_FileName; + property Options: Byte read Get_Options write Set_Options; + published +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + property Server: TEDICOMFileProperties read GetServerProperties; +{$ENDIF} + end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +// *********************************************************************// +// OLE Server Properties Proxy Class +// Server Object : TEDICOMFile +// (This object is used by the IDE's Property Inspector to allow editing +// of the properties of this server) +// *********************************************************************// + TEDICOMFileProperties = class(TPersistent) + private + FServer: TEDICOMFile; + function GetDefaultInterface: IEDICOMFile; + constructor Create(AServer: TEDICOMFile); + protected + function Get_State: Integer; + function Get_Data: WideString; + procedure Set_Data(const Value: WideString); + function Get_DataLength: Integer; + function Get_Delimiters: IEDICOMDelimiters; + function Get_FileName: WideString; + procedure Set_FileName(const Value: WideString); + function Get_Interchange(Index: Integer): IEDICOMInterchangeControl; + function Get_Options: Byte; + procedure Set_Options(Value: Byte); + function Get_InterchangeCount: Integer; + public + property DefaultInterface: IEDICOMFile read GetDefaultInterface; + published + property Data: WideString read Get_Data write Set_Data; + property FileName: WideString read Get_FileName write Set_FileName; + property Options: Byte read Get_Options write Set_Options; + end; +{$ENDIF} + + +procedure Register; + +implementation + +uses ComObj; + +class function CoEDICOMDelimiters.Create: IEDICOMDelimiters; +begin + Result := CreateComObject(CLASS_EDICOMDelimiters) as IEDICOMDelimiters; +end; + +class function CoEDICOMDelimiters.CreateRemote(const MachineName: string): IEDICOMDelimiters; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMDelimiters) as IEDICOMDelimiters; +end; + +class function CoEDICOMElement.Create: IEDICOMElement; +begin + Result := CreateComObject(CLASS_EDICOMElement) as IEDICOMElement; +end; + +class function CoEDICOMElement.CreateRemote(const MachineName: string): IEDICOMElement; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMElement) as IEDICOMElement; +end; + +class function CoEDICOMSegment.Create: IEDICOMSegment; +begin + Result := CreateComObject(CLASS_EDICOMSegment) as IEDICOMSegment; +end; + +class function CoEDICOMSegment.CreateRemote(const MachineName: string): IEDICOMSegment; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMSegment) as IEDICOMSegment; +end; + +class function CoEDICOMTransactionSet.Create: IEDICOMTransactionSet; +begin + Result := CreateComObject(CLASS_EDICOMTransactionSet) as IEDICOMTransactionSet; +end; + +class function CoEDICOMTransactionSet.CreateRemote(const MachineName: string): IEDICOMTransactionSet; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMTransactionSet) as IEDICOMTransactionSet; +end; + +class function CoEDICOMFunctionalGroup.Create: IEDICOMFunctionalGroup; +begin + Result := CreateComObject(CLASS_EDICOMFunctionalGroup) as IEDICOMFunctionalGroup; +end; + +class function CoEDICOMFunctionalGroup.CreateRemote(const MachineName: string): IEDICOMFunctionalGroup; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMFunctionalGroup) as IEDICOMFunctionalGroup; +end; + +class function CoEDICOMInterchangeControl.Create: IEDICOMInterchangeControl; +begin + Result := CreateComObject(CLASS_EDICOMInterchangeControl) as IEDICOMInterchangeControl; +end; + +class function CoEDICOMInterchangeControl.CreateRemote(const MachineName: string): IEDICOMInterchangeControl; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMInterchangeControl) as IEDICOMInterchangeControl; +end; + +class function CoEDICOMFile.Create: IEDICOMFile; +begin + Result := CreateComObject(CLASS_EDICOMFile) as IEDICOMFile; +end; + +class function CoEDICOMFile.CreateRemote(const MachineName: string): IEDICOMFile; +begin + Result := CreateRemoteComObject(MachineName, CLASS_EDICOMFile) as IEDICOMFile; +end; + +procedure TEDICOMFile.InitServerData; +const + CServerData: TServerData = ( + ClassID: '{E8400822-5701-4226-8F78-A784B3777CB9}'; + IntfIID: '{DEA6D2C3-98EE-4276-AA08-0AB4F1AEAC0F}'; + EventIID: ''; + LicenseKey: nil; + Version: 500); +begin + ServerData := @CServerData; +end; + +procedure TEDICOMFile.Connect; +var + punk: IUnknown; +begin + if FIntf = nil then + begin + punk := GetServer; + Fintf:= punk as IEDICOMFile; + end; +end; + +procedure TEDICOMFile.ConnectTo(svrIntf: IEDICOMFile); +begin + Disconnect; + FIntf := svrIntf; +end; + +procedure TEDICOMFile.DisConnect; +begin + if Fintf <> nil then + begin + FIntf := nil; + end; +end; + +function TEDICOMFile.GetDefaultInterface: IEDICOMFile; +begin + if FIntf = nil then + Connect; + Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); + Result := FIntf; +end; + +constructor TEDICOMFile.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps := TEDICOMFileProperties.Create(Self); +{$ENDIF} +end; + +destructor TEDICOMFile.Destroy; +begin +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} + FProps.Free; +{$ENDIF} + inherited Destroy; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +function TEDICOMFile.GetServerProperties: TEDICOMFileProperties; +begin + Result := FProps; +end; +{$ENDIF} + +function TEDICOMFile.Get_State: Integer; +begin + Result := DefaultInterface.Get_State; +end; + +function TEDICOMFile.Get_Data: WideString; +begin + Result := DefaultInterface.Get_Data; +end; + +procedure TEDICOMFile.Set_Data(const Value: WideString); +begin + DefaultInterface.Set_Data(Value); +end; + +function TEDICOMFile.Get_DataLength: Integer; +begin + Result := DefaultInterface.Get_DataLength; +end; + +function TEDICOMFile.Get_Delimiters: IEDICOMDelimiters; +begin + Result := DefaultInterface.Get_Delimiters; +end; + +function TEDICOMFile.Get_FileName: WideString; +begin + Result := DefaultInterface.Get_FileName; +end; + +procedure TEDICOMFile.Set_FileName(const Value: WideString); +begin + DefaultInterface.Set_FileName(Value); +end; + +function TEDICOMFile.Get_Interchange(Index: Integer): IEDICOMInterchangeControl; +begin + Result := DefaultInterface.Get_Interchange(Index); +end; + +function TEDICOMFile.Get_Options: Byte; +begin + Result := DefaultInterface.Get_Options; +end; + +procedure TEDICOMFile.Set_Options(Value: Byte); +begin + DefaultInterface.Set_Options(Value); +end; + +function TEDICOMFile.Get_InterchangeCount: Integer; +begin + Result := DefaultInterface.Get_InterchangeCount; +end; + +function TEDICOMFile.Assemble: WideString; +begin + Result := DefaultInterface.Assemble; +end; + +procedure TEDICOMFile.Disassemble; +begin + DefaultInterface.Disassemble; +end; + +procedure TEDICOMFile.LoadFromFile(const FileName: WideString); +begin + DefaultInterface.LoadFromFile(FileName); +end; + +procedure TEDICOMFile.ReLoadFromFile; +begin + DefaultInterface.ReLoadFromFile; +end; + +procedure TEDICOMFile.SaveToFile; +begin + DefaultInterface.SaveToFile; +end; + +procedure TEDICOMFile.SaveAsToFile(const FileName: WideString); +begin + DefaultInterface.SaveAsToFile(FileName); +end; + +function TEDICOMFile.AddInterchange: Integer; +begin + Result := DefaultInterface.AddInterchange; +end; + +function TEDICOMFile.InsertInterchange(InsertIndex: Integer): Integer; +begin + Result := DefaultInterface.InsertInterchange(InsertIndex); +end; + +procedure TEDICOMFile.DeleteInterchange(Index: Integer); +begin + DefaultInterface.DeleteInterchange(Index); +end; + +function TEDICOMFile.AddInterchanges(Count: Integer): Integer; +begin + Result := DefaultInterface.AddInterchanges(Count); +end; + +function TEDICOMFile.InsertInterchanges(InsertIndex: Integer; Count: Integer): Integer; +begin + Result := DefaultInterface.InsertInterchanges(InsertIndex, Count); +end; + +procedure TEDICOMFile.DeleteInterchanges; +begin + DefaultInterface.DeleteInterchanges; +end; + +{$IFDEF LIVE_SERVER_AT_DESIGN_TIME} +constructor TEDICOMFileProperties.Create(AServer: TEDICOMFile); +begin + inherited Create; + FServer := AServer; +end; + +function TEDICOMFileProperties.GetDefaultInterface: IEDICOMFile; +begin + Result := FServer.DefaultInterface; +end; + +function TEDICOMFileProperties.Get_State: Integer; +begin + Result := DefaultInterface.Get_State; +end; + +function TEDICOMFileProperties.Get_Data: WideString; +begin + Result := DefaultInterface.Get_Data; +end; + +procedure TEDICOMFileProperties.Set_Data(const Value: WideString); +begin + DefaultInterface.Set_Data(Value); +end; + +function TEDICOMFileProperties.Get_DataLength: Integer; +begin + Result := DefaultInterface.Get_DataLength; +end; + +function TEDICOMFileProperties.Get_Delimiters: IEDICOMDelimiters; +begin + Result := DefaultInterface.Get_Delimiters; +end; + +function TEDICOMFileProperties.Get_FileName: WideString; +begin + Result := DefaultInterface.Get_FileName; +end; + +procedure TEDICOMFileProperties.Set_FileName(const Value: WideString); +begin + DefaultInterface.Set_FileName(Value); +end; + +function TEDICOMFileProperties.Get_Interchange(Index: Integer): IEDICOMInterchangeControl; +begin + Result := DefaultInterface.Get_Interchange(Index); +end; + +function TEDICOMFileProperties.Get_Options: Byte; +begin + Result := DefaultInterface.Get_Options; +end; + +procedure TEDICOMFileProperties.Set_Options(Value: Byte); +begin + DefaultInterface.Set_Options(Value); +end; + +function TEDICOMFileProperties.Get_InterchangeCount: Integer; +begin + Result := DefaultInterface.Get_InterchangeCount; +end; + +{$ENDIF} + +procedure Register; +begin + RegisterComponents('ActiveX',[TEDICOMFile]); +end; + +end. diff --git a/official/1.100/examples/windows/edisdk/comserver/Clean.bat b/official/1.100/examples/windows/edisdk/comserver/Clean.bat new file mode 100644 index 0000000..2bca898 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/comserver/Clean.bat @@ -0,0 +1,18 @@ +@echo off +if exist *.~* del *.~* +if exist *.dcu del *.dcu +if exist *.dpl del *.dpl +if exist *.bpl del *.bpl +if exist *.bpi del *.bpi +if exist *.lsp del *.lsp +if exist *.dcp del *.dcp +if exist *.dpc del *.dpc +if exist *.bak del *.bak +if exist *.obj del *.obj +if exist *.hpp del *.hpp +if exist *.lib del *.lib +if exist *.exe del *.exe +if exist *.dsk del *.dsk + + + diff --git a/official/1.100/examples/windows/edisdk/comserver/EDISDK.dof b/official/1.100/examples/windows/edisdk/comserver/EDISDK.dof new file mode 100644 index 0000000..748fa55 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/comserver/EDISDK.dof @@ -0,0 +1,13 @@ +[Directories] +OutputDir=..\..\..\..\bin +[Version Info Keys] +CompanyName=Ray's Jedi Projects +FileDescription=EDI SDK COM Object Library +FileVersion=1.0.0.24 +InternalName= +LegalCopyright=Raymond Alexander +LegalTrademarks= +OriginalFilename=EDISDK.dll +ProductName=EDI SDK COM Object Library +ProductVersion=1.0.0.0 +Comments=Beta version for testing only! diff --git a/official/1.100/examples/windows/edisdk/comserver/EDISDK.dpr b/official/1.100/examples/windows/edisdk/comserver/EDISDK.dpr new file mode 100644 index 0000000..4a71302 --- /dev/null +++ b/official/1.100/examples/windows/edisdk/comserver/EDISDK.dpr @@ -0,0 +1,23 @@ +library EDISDK; + +{$I jcl.inc} + +uses + ComServ, + EDISDK_TLB in 'EDISDK_TLB.pas', + JclEDICOM_ANSIX12 in 'JclEDICOM_ANSIX12.pas'; + +{$R *.TLB} + +{$E dll} + +exports + DllGetClassObject, + DllCanUnloadNow, + DllRegisterServer, + DllUnregisterServer; + +{$R *.RES} + +begin +end. diff --git a/official/1.100/examples/windows/edisdk/comserver/EDISDK.res b/official/1.100/examples/windows/edisdk/comserver/EDISDK.res new file mode 100644 index 0000000000000000000000000000000000000000..2aff2bdd3ed65c94d0112f0ef33d6d139bb5a19a GIT binary patch literal 1792 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

    H-+X z(#}5*?-(bBzGDdKThom$pkaaR^{>Dr6`caSSQH(D$zOU3H8qS5M_sDgb0Gse7#$V^ zvq|1$N!}EaXE8cR`P80I{cf(6%dyd`Gb*sviVu|<_BHsWq;4Nxy3}1uXig%1i!r8W z>GV}YjG(J#a@2(R5xd1TI=~Z@L-A{v)$E7)o}a+G$kdOK<#DZiR_M0*ze8cYA2ktQ zvN{+Mtzy4Shr+7T&!nkt`3t!IrO0U%ll36zF&k4()j&HSFk}P0h8IisskQQFI52I|Q$rgN1UJY5Cg^3GzD5v!Qfvl{@3M!< z0n(0%t&A`@$bkcrFEESF7nU-cTMPmPW~DNaY*uOtNO60nVo)2R%q?|Pov(eNTmFs% zv*c&`PSisPV-M;pr@Oim=)^TZgWU`@rn}>p{+=CheDsx$qeJ}XMm*Y5eLhn!Bp6LV zubPhWk$Su{cAOgz9lL_*|0KsO^y=CCG$%ATFNaiLY(^Vn)mu`|kH$uXg_e~gkuq_A2D4Ho^0S&y9*dba#1?t-ocm&N;TLjAHC4O?i7&z> ztI=6Yf1o5&Uk*9t_B?~p-`ql$4kMgijM^jYj@G0P8%(TNAIj=EW*&`;2y-MO;^w~C zCMl8C$i=w;=uVdvzo{tiKQn6`$$muA>=xeyf#ma%hg&kuVfsKQ{SpI;);IWowJWy} z32GmMt?mIP)#|<=uf^YKdoui;ruhAxY*HNRRct{fx92^yi1K$rPpT!0)O_#BY$d%H zQs|U42RbjD?V1^|9V~P;=0zEp7(O($3ueU^z?RW4ik9iyd2pYcb&}&a?@kBG!_KdG zhdrpAl4Ve72)64FP_Xe+?^4cPA%oIBc!dcoKL%f&fiV03oZ4eP#W)MM zq){T9j>x=N| zN%amDZs2W}$L=iIh_!0>Vh{+zL4+iSw0Wo!CcBb%5*Jp# z&;xd&qvJ9Bjp>s$LiRzccYmUwg{b5#>>o?|Fot{l2Lu}0<0=x3$OZLms!@$-DpUW-+JHpf zM8PH!VGxCGPd`GKjmh>SKch}#ybsskxfeeifdRLt;LZP6euqCCgLgZgCIIjJS6nCG zsf=C;rvLngW$=N#DM5Ssq)qxU?rX4VTaVbZ^*`FQ#Mf+{{O893URf7rCJ<#3@tZqwRO?$Zd@;7L7Y)8@33%)6L;cNn6 zTZ`cUgl8ULQ}DY2`3|juZydtWCGg=wT%XjqtjtAsOvx^^Psm&0tYJU(XdlV0-1=gi zmZAkK*g|`p*7VAFt*)Eq6;w#6~Q^*JF!l}}2ssR8~JU|PckR6|$3?H%q zA7j#>_TvKM&8iX4`C9J@c?B7n1v7c>IA{9=Egy(94Dkp&L=uGX1zJ#CUQS*?D%#Nw zEcqCg%*}NEyHM+abjQ-%!X4-fkl_pYu3e87M`*p_CjqCp^z2-_?2j)|D=(&9#5D;- zQOxHelw;2s89xu>VimCPG0K5|kMClwS3G=*;~WKrc?J1%Y}$hW;9~$0(a?30kH$Ad<+QI?J@~L zmqOMHpAPeF0spW-XhXHWlXC5uOA69+5;L=xWZBv4bpQ$nld%96U#|6 zZUeTJmI21{uF!%AB)j}J)Cj}N>IoXU1d-)>;wOWr^*@fAd8)WlgD2C5g9fB=#9gcq~ zHoqyurbQx^kG0K4^OO@ff<1GET{d1ND!m!>@Ua43ubl;V+H`w*4pf0kB=WHWjL~{2 zfCNnVU;tGCfR7buEaeWdOj~$+<{~@k9sr8?Si#0gTnlrggvz=Vavas?V+FcF0)fNC z7v$wPF0g5h0N`T|?k2#5A)SvE#>P4UCWUAEh-d%+_*j7wNDF|{@&g};(>5TLj}>AfJ&cnx z(+eF1nQWa6^KIHt(96dPm#BpTF3(YzIew8nds(_YbLTv$S!hE(R>(;_9w;G6KHFe4 zaPhH1P3Az6P-aub0ECYfEXf3$l8G~n<3QbRl*h*kHpMJ6Id7SytPT)-tWe2pR#|3R zeqFjvYe706E6h}4nrTljuyY*j#?S-{^6{}kP4h!xB)DR=Vn>R0raz`*J6DT3JNAs{ zg?5g|DW7(_AScu8g7p0S%mS2yb<%XKnC-hJ;K=Ka-;C8zf2h6629R}ZH5cJx5xn(y z|3aJi?&IIEVv{S9=(3u-x|h^+f7jdX@7k3!xc1;eC6eFv(w;bW{O^H?G*>4PKuQEP zA9C&S*j}zq=!XQ~=Ahcx-~c!N(Vwz-MQ{N23)~}X+-vy1~y5Cprnd>8xgDfZ1?=6oj)i~B=XGQ>@;x`Ql#gn z0?!IgF8gKW`8I4ts)+p}DCe+G1Ons4WXI1c7I%mumwtZnUC^YTUwjg@N+031%9d06 z;O{i$jYX@#_Cnj+Uh(7uzx$5H1;#i6OOgV^NXJGtVM$Fl+QU@7g_TE`kFCjk@YzNv z`<){+rrcQkCS;AKIj(VHd$}YZ@8W`Gzxk>+V2PlI7dy~ZEfufvlVh`R1?UEhIbhhI za)cH^iXLK^y+q&J+9ORYuA+wL@#j2&l`*?36JXp{La6vQz^kRGH`KLEGw)pK`KCulgD)$EY8LxfAXq4a6 z90F%d{B~z(-%OS9k3f{Y+m(i^7}`V%YSKK4C9Y-n^QD+gfP3sU&^Pema~OIQ?H4`ryML7)2Oy$MYf;(Z%TggR!2VH(NpY}!-tQj%oklVB zB}a}`=g$}iC1zK^uyd2MDA+lhUUfs^A%oT&>~zbdT>i8p`L>#bg1}6kGMe0Lr~=gaR4+n+jQ!B zJHmF^yc!03v;3lrx48$x^Z{TYjvjX>dm%kAfV?TUW8=P#wI8nVq4s*ihL)Caaw6#* znRF3abGCR8K7-DU^PEt5`b(ILkf(f3uzUxfG2qo{k$ObC#Rae+ zWB4y|?vX)vIoYtB7_qzL#0UdW*$J2p1EY8}0;Y1ea3JhVjS3!CR}mg{G%h6;hj2y( z9Id~wCdGwQBW&-4ZAaLD@YzP-dKs7rZ+@H%Q8d%yC`+_~MzF)PWgrK9TwH=G0%&9n z{>e5mVb52v{UmHGU_-aX_8b)exJv#r&$hE-zaSZS!z66Df(-`H#!=7w-Q&9wfH{;-T>2*xeFtHFH)X7 z)$L;6cO6#Rff5noQ-)#HeG6weq}HIv57y&v?hyYUgypwiyRjm48t`y znp3gS+&YqWdh%AUZeX^^Cs<-fqy1$f-Uom|Uf>U5^Nxnx#c#jt6J!1ZY3@sIb-ZdS zDet0QqGm83|FoD;4hl;ig@Y%r+wpO9r(Q6nH<$1$(5-Xa{GXTFdnUK7n$vk1` z#yV%oJ_LM^)ZxEAXOu}_on-hPq@rO$Wcj4qxgyX>j|uG$zp(K7WVCw-1V6{F;lDJ>Pux=*A!mlgXu^vQ&I*kyj}{a@kBfKLayo&Du> zD}7J)MK_$gao;=_m@%)#YM{fs5|682@-dtTa+Wlr7UIeD!_-k_?t5y$lsN=c(yzB- zw114@>K5}zQ7voIZtmNlkI^ZB97OU*=^7|&_63r_?*ifDquS#*Hj*k<1R6M?JG40O zH8lsPcUqZm<+zC>e}N`YD-Ibh2tzPKq}D5zg3uBS!anE*74sD7bBnfje)ZX=Id&mi ze~>8^2&q4`=OMVmf@;x)u#V|0MAnijq}+jh{w~E$j^E=4kduBz1&XP|JQeryO=>$L zuiS|Inr|wyuNhg4H!=}RyyPRI#Dtc*E1AetG7-vI4j4I6{>!1;Law4zD?}<6mP6>L;FoSb+0sHZR%7TPFL^P*YM}j*8*_huU`RV-ONe_VK_+WFKn@VXzOE zl97h+2u6QkWRH+tdlkv^VqBerJ6rF7SgAg9i0ts0Ef%mGt;v9sHKkK^@cQ4YRjQr_Zcj%gq_gg@s%1bD?Qa&d& z1*TZsYcXeO&ZOMMc{EO7ep<>l%Cr75on=Sj_e}RrvFxza8JTxFvI{aZ^pen@iDmw} zS>KH^<{~}(f5Z=mfBeyGz_aJ1s&6VSaj?v1X7GeK%B!-JXMJZ*{#|`l5(kFP&p6~CMgZi{{JjUiZfz#aOrHNcD6bha}* zO2tt%aJDpG?EDa{I0x+}LY2Gu$3`w}U5|6tlB4_i>}==9)$9VyusvAile0>`*FxP1 zhvazjQ|V65`I5z5OS=UWisAU>v^aI2F)d1pS~N%acDjI84=Bf-6LauSTn+I;r^x&5 z%E7lm!Yc<~>1~IVv;SZy___3N5tq__;e{|y;1=|LZZV6A5C^=Z9I~R9o1V5j zcaz2an-DsSdyk_CRQagjr;M2wpP7@Nl|4`1GL@0J%$}E*Q#cR1dQ0>St|5m(Z(2@4L@>vx0 z^O_QG#_FY^rNs!9)a)qnhKJtAca(k{SQl5MXa#3@ayq1C>)}Nm;td>mh%XU2_6uzR`ZtlwN?#e*-_H}?X>h#16)G7E+>a+;g+kkK!y6qPF zFzs&6ucEs{i3>lq8>fP=fUj8C{TQ4*v24Qha#u$(bP~c#hGH1{MTWM=;@v3vVixU! zf@AuZvHyoJ%+Fz290xL-k<&h$xk9!t)6dlYooU=kIx-Eab}}@(U1*Y`ai4|8zf1>> z9;h?zY0SvKqdkrJvVH!Hrg7bAxpdYYqU8D2~BHNMSDcK7P(hKe~!}8v}^rbR0IvL8<$Q?JS(6D&iwtrp>3x2@g? z5HMZBPX~jK4aNfS5i<9=)t_7eL zs$dwNj}veDdd|<==eHQRmk{@t`X$t0>ti4=m5NJ0u{QDIR;2Tq&p_BUKEu*RE^qPe z*g$dU0=gYS)xq_P4|BZZ6dIHlSr0H`78x-SBi~QU`oP5! zM`Tp+ljcs|Er*4!x)URD)rFQ2&jd{hE?yaM>Piew{oKW+&aX^wJm!xL#_{<9@Vlog zE5F({5QlYbZMCrjO~tMGY|oYK9~CP`yyYJcZ@q?i(i&rokQa@ZQAW%YMhtv=L2n@b zi;vK6reGP5CZvNBhVi!@=b;U^MK1ev@3Xz@i~-_|8z2`zwQ-S}GcH2D`)|E?>?NApo2V*m@@Ii# zU6c3_-~Zw7oBVCz$xbZ4KDd=<4XO_TR#fM(^Xgr31aA@;fA zqQngnqK**vDu}R00kKR%)Vbn@iVF!57ww!mRD|Ibfb#)Z9YwHruq}Y`Hppe$Lk#f> zgG?GFG3-H3@g;cw?da6qgo#uzqnSO7Ft**!q?qbNhO3VHB;Za09$O%*l*)vk?jYb! zXVNGI_#gnCGeI}jTQ#4)95^IR)C51>PJ}VK`IFm*zLrTh6$0#(gQ{8eFy=MEAHt_cT*3TZZguJ6v%gq7{sp-7)|@hl7TjkStxe z5%n+jRIOM*gq6(Z&6CYG1d)@>$b*O!bAb^0=~=aL0|T0e;lI{A*k!9?xtFMNYlz@w z2Qb>I;D0Js!emn(huPmGp7}Ro;c?Eg86Kg^{c*l*$U0{1g%&T5Lw{{0%5^HGi7BPG zvnpF%Fxg&?s<>>GgeXuDUP3IC5S1>NcYCn1wIUU%)nShzZQCMaAZ%f_u_~KP8YZ)C zam7s$bzGL#ii?;nirH41*)}s;LIctU0SaUQb8GFzgVZ4d#xZ+~PFqLfuv)P&LtA$40o@TaN zRW_M4O=f%A6_+Af!3eQGB4Uv&^3p*(?JA*b-U1((xXUK+gHCA_kx0i@idabyOkdp1 zQ7hsUPC2Ib!nxCxww{b}G%trqTVGX9GA2SQ;A)aUFpL0r|1(>N%C?@#Pa_*lg_;8= zF}>BB8TC9!f~A3w-`^seXe*-&0EyKDgdviW+rXKh#=2IV#6W_vC2oK?evCE^F)g$# z$w$xzaR;)CCvQWbt4cM9B&4%a|0GBY$}2!bwX9CaQbeT$V>uxDOL`>bGZa0N^6v{e zQQo|Rl(&%bp$c+0DX#*gUZJy9w5-rZM5_uRhpbd9D%HkH{iatcLPWKzlqqgr1V5B> z<=>PvJ)mJ&EWKYL(PdlD%|U!i1X2ivs}Ign5AojojV^rvgVvI|?8LN5T-eGm zSITkMq`=o~370MYxNF9VP4}$$2X<6tYO^WK|a{suIM`3&GLCG{geE9+{(@Jvu*V#jSj8}{m zrJqu=kAB=x27E!mFi<#x#0x0d9Gf>G-R&uS6@$z>pStc^L>PbTE$>F$tB9jT=+Epr z^aqK53ckZ5V>{dh%buqFCIr7>v@5Cl!`%+6Z2iuB+BoFh8!(Q_TQ}V6je0l}0!{T3 zcFF~q_HDcj=0d44;`|%*Ww^4BJ-L#%`xLJn;EP;#ch zJI-6&f{K40<>(&QJUw~{ZqT3QIG+gUI-p?F+Q!6RaLO?s2b`Z-h*1{_J~Td z2lOEi?VvxP=i!bOW!>)ogwY5*YvdMnr^pi9s2Y5U%qGSNz!77<#Q2!RsNd0y1y4xz zN~DWLU@wl#!2O=Yc)-t3=nh!2kX+8>cqHRW5#FNH4_*?pLhy>w76_19v4mN0cL0nR zc#}M1D6$*xm*bs&C2=9uJBiC%jiPu9(^WE`u;XV`0GFi#!p*-PCT|$XytAfD4qrv^ z`eslejy1IXoZLxXzM8aPDKNBBv6H(tky8T#f2;|l)(@N zLs-|~Uh_|u&p+ARPg2R~BN&~I?lJREGDhY*h#32`49a}_7<|x#{||%3W{>_Cg9q@J9EHDzZ5O^(G8~ED9;u3d z!q)M$pDrYH`WuIIV&JOwOg41wJGeJ~4{zi(6SP#k@59quFNFsg)>+E2z8eL;g!KP~ z2S)s6)Sn}-WBt!c#R-P=LbP|_GiR<>IMV-b>(xt@!fLI}v6N$dH|n(t>Ez0P)~^Fv zje2ni8TIOs8lSlsI|R;}eU@?z+}7Ww{}=TM(Mu_0jnHYu2GitcQ?{GivM&hwxx6$i|2GGja8L?dd~h4km2IcE7GV} z11SkUR-x|Q)V9m{?6=Ke%OPO=*u$%O6|d|C8Q9t!Fm>$5MLmjFUd<3*uN!ta!5J83 zO4G5mtD`1C{l7ro-{_2p!bPWWe;C(y%)Bx9A`|ZGZ02pI0T78%fj7@pdWKFzxZ228 zG}M*B(X!;{K-|3dn@K}(I~roFG=xW)8ODC$01cmYMZ;*)F!?kzI8VSDw!7?olM@jy=3G!g;vt=&Eo@9O@M88#6D|=QwNpRL5bsA-%_nD80k5zv03i z?5*J2rSf#}o(-mKFpf3yvXhkw3A}}%jb0wc7A`h1T15cF1)A~F&}~5t$jZ~)xX%E# zH}PN@jzC&+M8-|EZ0YU=Fq!=Jm&xS6-K;ADG&?E1S<0W)N`Se|xFC-Jwx8zk1+ zewF@P_Fh#PFUGM>hz~>4HO&?72e=4s z3eYLqiBVr`+m8iSJ$x0`G-1lc!l4s);yJrlz?@^-Sz)UwDXNj5RI1TGm{sGnu@cVi z;%wrtlU3+m3;e#cI-n_g2xz)Hnw)Wg6}BBt+l~rbRY_5m#8IW=sDg1szpG}|EwZ{> zONzEikgYn%R;+7fb+>k|ZX{$dt1F;->(z}56!$R1T7K;^YKaaFKm`MuLrUDizT`cj zWtT#(7Z>e^ThA_#$!#;O!dB_DRaV%xloV}|By7=1*dmjiX#&et_;KyYpKKfWF*ZQnXoO-mGKZY*cP@=gP%l(aOs8_E!#l z`3KmR3&TWKux*V|L6n-Go`Y zURQ;FRgSCDzAxvAbuRlS%7dGXi9+1+0I{6QH*}iIwvZHPSivw~(1IfGQCQg~EoXf? zPT^WpPkRjLN!-yFNnC^^4(x?4wZYojk{bqqedCr1Uw^*nenYsfc4q8Ns1 zd3eJuRI;^`Vd04Q2V$>)6$Wla3ND&40ws8UWdGyt2*TaQ*lt$1e8$ue?rjAZOSsL9 z{R*ZH6JHf$))S6b-U8nM!nH8=RRtF&=?nZPV)6mk%xmR-p9G+BjB;6lrZ6UnKvMwp z7=cO|<((!=RG8K=W(a{U1JIoW+QX>5R-gvP1Q3WW-CS)@pB)Agr{+aowiGAWaxRO^ z#ZTm7o_dSS&W*HZW$Gz~DrvaXfvI&G>uCeW`1UB4;u8^(SvaT>nI3r=VK3t@ERHVN z?@~BuC&@2>g0n*D)mI{XCL9XZibdrk9<|T>zu{4^o$*kE&R2dWrk&-gKch*9w_;;^ zP&?1gU9=dU9kRWK{|O!))`~{vBOV+;F>M{EYokTVKE$Th!HwQhZ9+Ww6bj5O%4YIE z;L*YTcq9*Kq#Xgi5`x!d<6ymUQT9s)6Tqc80ac0AsiLrhTs4Jn7w|2WZ((@D_{?6& ztJ59BUAVBSVt!+-t*N&wt#Rc0Rq?`yw;}1joQodj|VzHaL zUo^s65zg6mwPXH;@}N!@#v(r~5zH_(gvxy5p^MpC#!&BrYMQJuK{Q zU~=w8+c$C*e$b|Ae`j~I`X}N6)Igwl22d3icH+iF0C6M`=yL)cBG7dPP!2SE@xwF# zagY#55Ge3vMBg)uU1f)b=#co#jLktT?9)||fEQQ&gL3VVc#X*em?>FLj$(3{p1h99 zLzz5WPnN3xVTcswb})GylSB37(aimso;-`mQ<&V6rpg}5X}9}c@r~zhGc`hL1yd@ zJrip#R_mF%Gr5MDp0Q;5Wr7iVpPq@$BPQ#aK4$VhX3DZ;sxo6|=$Y7tqCYZGdD#B< zUws?pD4i3`dn%KpwO7W7SK=@;y*@{qZ+T$WAs|KubcOzW z6oS&qE7jHJy|ZpIi+c>SQ0@vx?829BQ*V;fjke=$l0ETyH}+|F5WU@t5~~9%QJ--T z)r>wg9>2K8B%G0#F*5lOrduLs(gqS+w^4G{;BV-Ft6$>t7BDmOCF`gr9eD~e-hX|_ zS2D3hbd!no?Gl?W^W5~L|1zW_0IhKAe9<{GP<#f4C<31Gv$Cuh%v~^Uk%1J}b{>9l z|2?r{$zeODv@`XMjed|jg9{@w@-hpdSlA;oS76}{VMrNCxh-`LeV=3k!l_U<3h)UY zrG?}zmih-SwTh%9jg%^dU(`uWWf4sOnHi>zqT{B1V(gEwtd4TDqdW`+e0zI@l9Rl& z7_vDdbFmcVrc9ocyNF(!GTfEk&`~GpsOxZVYHA*~eP%jU}M=h_vZAqk~Vw1mY~4$U(fCp!vZx1jHna z#7QKD8AeQ+(LaarTNM9De|>mzBNqneHOST+IB}|D?_A3{IIL5+)nR<|fDA<2Z`{P{vDtm3@puvTM zie<>qwd6vxOkh8xO zXb&Oec@XX3N^1bIZ_~b>)}V+D0s8JV zQK8}$L-d?dU^Icz$zr8+yMQ?_Bw8t}cNvLN(*J=FMhBVhLR1~*sd0Fh_bjT5(&QD& z%3=mKnF83VR91Twpq;yieLM*lsj=Z=(G1O#l>Xp+4~J%*^Y@vJtRfuyOygTSR32ot zqB;WA?e?Cx2UOjLf?&GcRSuO=GFaR>W(mTXqST-aA@y(-9NPH)vy*yIZmaiKHran+{Vzp z<$7aiUq6Nyvbk^~wpOG|@IwlGGr;BG3MC_u!|A)9few>{v*sEJtIwL15*EWr!pZ^k zx`f5C25E~RbaDHLlGG#5CiDO@dSnL}FSe(Zeu-?KdW z{;}(7{e{Wx*e7t}Qr^HEh>P4Vmbnf|#^2MHcO&j4 z#Bo0={_!)PRgpdbRVmsUJbh(m&LZv?h2i%+V<)GB3xM>6wS2>CF-)QSAP~KELGLuF z-KAv>1X9xvwpMJa057DsEqpy8mCW883NThP1Cege{SV2eRj#<1K-}IH7hCSzGmya$ zg1at-5WE&mqx8eUpgK9bun?a$j~sOQAX=QD-zoQn^c<**Pc9-TLfK%ezGw@rTkAGtL9mn7qsuHLcV*VeYJkiy{`*0e@nHY&<70ed!BQ4 zm?)I((?aH)#aHM^Zt-L*snm6(??&lj>_XmD3R#%SSu`ycw8P~X)}k1h4+pVZ#QT^b zly2yi+yj(Wyf9VdK zqKH~$@*Z^JTw%j_#tTOFUs(e7SoSLakF?gR2>&u&qPeRoK>7<;c*}=!y#4hN@y2+Jp|l-ci*$8G?ofovyNK zvkXDQgHBgfwL^xW;X$XXsj8PDXn0M~@Lb93ULA}@HI{hjOEgh^9uQ^zOU$o~n;xU{L0 zQai=vX4|=UV1-MVHY2$s9OF`NPBHOO8X9opr^XvevMkn;X({7V6Ae6)SL3@N^j~VK zND~!lhx~V0C)XGg&S2CP_mEM`3yLqbBytEYo`Ituw$|EM9ImnMhlQ?rf#vS9wcrOg z2VjIl_!?Irv?-I$_L0<1)d_X6=V}Bn%j5?(Vw*Flo?;BWThHN%SM}iylN0?BBhSg- zAm?tIcoLsC#89F1{t)xX0f%&OY>pQ7`Hi#&nAdV)nDrXmq#DHB=-CCD8#BdYg1fo9+Cn*5(Uf&*E4Vd=R*e@Z!7dQf?#M9x094IqyRL z-ZSekl>IEI=YVyjG8;g-Wz4$jNSdHV9}dC zAG+e`s%c|?FY4y}X4vnpN00bU`QWmM{^r4S*P};$f5@=9lUapbWeQ5%u@9eEwaI%X z96iMAY_!YEj;?;i6fCcTdf*aQ7qjPD#TEER38pdsHubi^12S^LS;4+QACEjkUMxv35$NbeXjK6;gh;j^~7+MwK zOFn%*SPTXed}TLZwBthP7SfpVu*e4k=6*O0O;q6`&5Az{iZ-@%bvL)%CpWE*q(xzfEn8G>v71{|)DCGz8yOWVpZEKkx$kqp z+8^KN`^WQoUXQProO`Zc^ZS}>X0DmRBp$KpY3=J+>yv3MeNg8|sZSwLW^VH%)%*B% zVvK?m#<*5ue8j`jL`m}Y`}$bmM&f9`K3eNcIhN#ck&%M}rzQNyUoIs2;zj?Sj?by% z#*K@e?n;_DCpK-~+@yKaQs>S|Sr`lG)j~7Irg6D-)R?U;!EvnPRR01AZCc-pn29z{{MSMU);#(-K4s5qu%3RsEQvaKS!4 zhqciJJZQPE;Enr1zI&+$ag4HeQPEjJrzho?#3Mo%vO4u?rx?#YvI0mHs(BBj6k z*DaLr^J-9LlWIf4>1Fjk3@x8L z!-X_7{by-dENOtd3)0Y}&O{nIa51-4S8EcI>m(#AI3cSfAp*+Wqpmdx$&!R%FOG$= z=RZrx+lqxjUL4+2)fg!{hB6`BO+w!Lqg^6t!3k++JMsu9bDw$@`ky888aji|gS~Sm zWZ!?5kU5eN@}fDba3-V};_CL8ge=er$@h7ZgA;PSBt$@&^~xm)Vbj14G80k%pC#hJ z-&h*t#mPu@7e+f=dsQ6ad9Q~M9MlL?YXFRRCh=^w`+2mG7S1r9L}IaPncIY<`aJPW zp1l069w6dr0>G?|w6l<2VXu2Z7W5(@pza_T)fkSgax|@t!C?quo}gA@P;iXWk zbA+kd_Av{HyiD72$kGMGp4MBm%U3-GzwqT#?|p=iry0uaVX^oo6Op-tR`pKIhkBnT z01K}ynL)^t8iY>Zos;78!~tFx_6}m(fb#Q7SUva#6-2w5|2mxiT~*|T&T`2K;iz&~ zWuxmZ>#FsY5xxUB)@1HHi?;7P^G8uy#hY5GEx?APnRLJ3j0kXIZ7lJTNI-<=5w!j! zsAFswY@!*JaQG~rZvvvDrDY^mOBi_G5t4*x*N^r2#`mT1FkF{R!4FErZa-a5%TSje zqON$k(ob2B`(3rjJ=O+lfq5Mm*4oT^sm%r6%uR4_Wi)selLR|JU}|=62WasoOD>`S zk@_03Xd*AAU^_4srM*>6J3=_7vfC&pzSmXO>#9YoE~+4iK7{DHcmD!uC|O@-MR+Qi z8iRo?Rtqo7)Y_8uwbq6UeZE*`5-9;*7Q8$J_^QX^ud4b3MuWZlwA{@;Uvz&`0({jm zBwYbguZN#?Ygt0K9ncD70QP{5c%(HMl^W7<6!TTYr+$y6ppN$?pz12fbrZXy=acWM zuqZ|zRACZ!^{ueTzBC?&>$X$y$FEEAI~8`yi>CAKN7Ml|t;&T-v#&xYC z^v4Ezr$Bj~O&B|5-TTO%RD6UeN4tvugUSzMfdyAS0lw;R{8bO4221wxQ!3x;PfCEV zI+Ub&AoY6qS=YqUUbkOY{vhn381YW!e~!M&%HQ<`D!*L3#xKW@*qhN;UwtKKz-k7p!W*Ysqa_bLjjxm zPQho#Z{Qa}T^D@_nH*cn(tC=f7p&*Hjw6PkZX@A-CD+-P#=~&k6bgOvRb6tvYDF3} zx;v2wuY~km=;gDZdaHSXp1Sl*B*(+gG+%X_p-&fjhBSS((6^KRv@<|o%}=~$x=<~{ zsu1;QOGK_8V%ZI9j1DBAT#QeDvC!qAynVid{pkqsRkz}=YGM6) z_*w2L5bA9F#cClGb`P{qP~F>=xB>(n?_+MqN~}UW>L!#y(J*D*23zUB&_Xeka3u8? z;Bv2W&pOb9)LShdqtqp&PND6gL03)>izvMp@(zb^2#fG}@a^--smwqV@JLw8m=~&= zo280h?Z^UgiNq0(;i2e(jwGfm^N8QilZ@wC_#DBu<;xFd9+uU2#%fSqtI)}6c_hRQvi`0H;IqAnq77ou?0hy@(4hoN#$ zH;KB0sE0(pHWI<;XjDm^`0_AZ?y-;vfB0WnqoMdjjgl;JEc@0@*ezZU0p%WEEa;CF zx^SUu6}s`H^9mgS<(^2=O%}Q+(s>R7j9kXqx%~Nc%m|_7o@f#$2yu)Mw`gLgNNx~f zLd!j|B+d}xvH0{RPA&J0CoEfF69kr0?ujF8t-vM|hUI6^6v8S6HdW}7%RTXg?GRXk zz!J(m$%M5CEJa}P<(@Rcl)y3smR9b`BFuW1rM3v4s7oeXY}uo`Fu{rhsxAh9)E8LW z@(Q}#vzS~Hgex1L>K@vo`?|TD=&Npm1b;kPO3%cLavp~37Bd`=*5Z{gIu=C~h=@FV zVlfVVhOlCRxdn##*IL4=1h!6Kn1K`%woPEA0>kvEjIccds}NXyxu=q_W`R`+40FmF z!rBB@i%(zmJ|s`_JLhRO5(djXn@H6qR9l6r-ll5XNh$`*J=;hX{vHc&JE=T-0M>=~ zISVfasJaRGqn=4(;SpW#*+H(U!nI4d{0>(`U#?=|BD&n;Cs&$q?IBn7E`TN7f0q<7 zSnjDORi04o!>7yynn>=GPUt!UXOvm5NN>lgWShT?iTenvfLKZ!SiZihc>P_LdzP6F7TQ?Sgg1EP*9 zuIPf`M)l0I+E|{|M?2FN-UTuuoF(nYpS6{6OB)!U>- z+En#xtPzGV@NN>|4%PZLQYIli@Wx>A%vZe?ShWN`abEe%QlDZis%WLpQ>(d)g}X;h z7m*B=drI-Q(Nl)MSc%zD?x~P)r4z1_a1F!0Y7+0}@}<9)&1)97TSU0J=MV62$?|#D zfdc7ViyxLnD>Lq4sNcL5F>%ywl+m=$nolz&cfL(N3R9OsGIsYN>`mmx+d5y}1lO~G zIlN&6mTpZ`bRV98rCyf!W1vk_Be1Wp^4ihTwF*;fne!G3oBm4BQtoG1sN+!nkDDoZ zlloGAx2aF@+tAUFk12SYv+kSD`LX0lFA>z<%8`;qTt_z*RUzSK^v$~S7+xn~H*%}5 z0Lx?8<*(!Zj=Bi}?0++cC(JTD*FixnZ&+LezbSsBDOvcGZw%b<8|F?>AZ)IXbnq7~ zDO}YDzpS9Z4%3JAqBYALxf6{X#*rQLy~cdgMj2Oll|*Q#C3vrMY!IES-#zx^F+zFEiielKw>=d9Ee8zl7H zy1=shjCnKDGG@-5LorVJcpp&8w50jAY^Hez?gI*j!Q$oJKPZxM!YAR&17W6t_YB!G zc;C&;RBT(^G=189>|Qfn5q)4c&76~=;cNp7T=V85T{oppn>BadO>;6+r@Q9avijg> z&N%^3x$|5pE=1&TGQJUjPtTm0lHfpfo|#sARy#keAMVkoO_L%Q8XGnv zEsbP-VAJNOIxvE`hGamnOId%bVdCG~!16|qYYZ=rJ z-$Aea$M?)%0Pk>Y%gTcW*dxrEIM2d7Qm*ENO)#1sLjuDZNHn*AxiZHAX7dHyF?O$~ zXBw|0lU?+wS8x}-ik#2@$2 z;uk+H?pVAgBr$$g(T63+2Sq&U`qmkjwn8Acey1$qkTP-wh7|1XrhdzvO_S>RQ@P!% zoeZ2i2zVX<_Yd@FhsPV;+O@9beR~^>nfHrp;c8s!X>W7=YO%As{e(k`sQgC|Qh7xj zs^LkLfc0Xr7~nj#6QX%tXrub`PL8vk+qMz`_XcE?HLS@V*R?%{7r~#tBgu4bd()jtvIntbm`H;JJ0X{t4=i|K6J310v{xl};@oAhD z5}M|d`KQ`N0o9y}W~rD0#Hr_^nNjLe59cm2Tg{Bp?6-g&ds`r8B)eC^Y+H{7xeKY*O9g~OXCwSm1Qf330_2rxV_%=|P;)uFcrWwK zdj`1Xs?;Yvh*~DoY4jwMsdl3$1vIcwlko$$phe7R`X3o9XWi<7dNh%uC|`9vLKISs zB^PWWA(YEP$t}ho>~A4lM@^{yh(_&|u+LXUDExKtwoScWRP97-v%AA83)B5q*xA?tLP*lx`!r>7 zw?|TaDpQS~@;5mR3vX{pm)>w0$v&yWP=dMiyo6`f*SCP9nyL57^j~&G#7_%xVWL{H z{s^W|n^-l~agv53Y9Z3#^)cl0OePEs<$N|(38_=YNgK?U@}6LL#!0#v>XYs+oo@CQ zs)3U=>-qdX*U1A*Qs?1x`f@qx%so8Z|%0 zRieZ<4F|npdY>jJcNej^1Q=b`Qm?SlLj7E{3B=HX-7MLUF!RRF4Ed!R)j^qx6M%|k zIi@WD9a?55oK26UVRMJHc3kqPhX&C>HA;+;He@gArQav#Y z`+QL(w*`w!j|OqdAEkD^+uJ*%*T?Kfc>aOEj#{0J2C0*(c3#JFqkOdupA8)wmO{CH zpmm=b_q??B(os-8c*RFnEpe=TmT|GQRu@? zg1$k5wDdZj2vDD67|mpBB9!#8A78`({xQ9rFAPOO zZ8_#*3vDd{$D=OYIN-(cLsl8Q`hf5mK?j5@VN7~)=kpT59Z$h>YB=1$)+dT%eRS8QLsy&W0NbI=&NR8yq;b7tA2bsM;rk(NDg$Olt+l& zZ<^pQ5OmtqSc#52diwv%gl`zExMw}bsTgX=iBUZ@f-Fckw|P5bFU z6u*5b`y1>`U)u+PjvukhNG^UKb1jhj)f?ELtDEpC3MuatBqcr!#+5p-9XMRsm>8BRu}fCG#pFYdO*J@sGa2*d5fC6ggaGyDJyIS#OQw27=+Et1H( zeTm^}x8}W?WLe~G1(}KLde(llvo2p^ zluFUOuanG8-dh5^dmP{bo3~T#6y8o>Vzi0`uRXZ7WMa5YWO-~PS20D!YEkFHh~KaB z9q>>s%sVHhu99S%<6-zD#@5v`uqRszZW^h#5%5lwllch_un|DXe5~?SSb3sgzxoT2P2_L~I9_&uH<9D5)5tNdG4VXcv5m-9 za!e0!-0uJoEUWL~CaoIvIVSQ1--pAt zpS@y@=peTJ0)wPZB5eVY_{T75b5`H#eB<$I`Q{uJ2hVZ;pFWGuz6HNc!3Fm-(iJRm z=N9G^2#)d1ES!;&WoUJHdcu4Y=Dc@iVM4xpP7W-7>Ol1m_Aj0WON>!}osVz(U0i&d z`}KbY5~w}+aOyKPC3l3uMy2~`nEEe_dsK-CgsROZP%l39yc1N;V#9nASKCjI+C97E zjwnjNOb8yRw{Ymp#qD5@TW#`&bh$U}a7ZG+>KQa3JX|*t-*PirXv>6Qg&*|^h0Ni3 z5c`oI@O(^t0H14UiCeZoJ`CU<^*ao2PMvolHFTG%0kEOtdFUWHq9gvTc0OsIGi#Bm z5mY9h=>I0*DLEJkKeZ$?Gd5Y$mb4k^2SsOx1q%AmAWB9Ev*y-*QUn2N1^jbPfi;h7K>3!r@M2*rW{o!;Ei1 zW7{!yDd$A(p8~02vHd6w$VSXjk7I1d^`@#ag2|Dw?bBZahp`QBv&=$tAbX8uQ6yVo zlXa^`A?wClFX~*7A(KhrPI?bXdb{p6RdGs7nI( zKd6_PG0_|0>eqAeZS+PtzK!0P1rnn-@I>Ps;Z{+EJs8aZRr!o?j61W#>q?O)Hq$Gw zgt;;!92X%|H`+Syg!Z>(-U;n*>O;ZpZ*>pa-!DT@l&!q+#cqGs0*v;ziwJ3dwJ6G2 zG;G-Zp04TF{;CkocN9)=`#S^Ceoy;5hQ7}Bx9N+2qy52~u19U!@-N%pV-Uvn_YuaX zhK}J2zN`HOwY}TZQ7wTtfnH06B`0qJeGPuQCUyfVZvsKjVVMASZkTBu_k+D(0o;H? z6c{rOP_WcJ-o7Efse2#3P2JA{iLQIrCC8~d#?DMka3xCJavWlK4gvTVpn+riOijZ% z${k}}Df3+#uX(_LHCpmWyJ$joc_&#@`3=qGH?)-BfQvACY`gMybgw=adv5v4t_;yz zP*npTlqWsq2=0?9Aa^M)UjA4J>DkWL-Xcn8LqlU?Dr+#(s3Iz+05oI2>j;w~Co3^| z>@){Na793mib8#E-cH{a*FiX_;|wioZs27y#lOWnnwS%AcnCh8tC8>?ceV2tP^{wM zLxu8s%654``n3yF+eL+Ta7KKI0U=E5(?x-Nco_-8J(+q{)(Zu|lnLkvr z{*YuI51UH`9723prD&1@I20&=0_a$8DwRttmu**Jvd-<;Zgp)HU+6e8JHkUx8b?8| zMLUBil|73c`bub=pjF(*f#kso8j0!@49Pt1@CgPTs(=sh+t3k4j&~42@%pbgX11XN z26b5(nt1C&(3rUbDGBJTpfl>YHU=+9<61wtE+&je<<@-7{=%bjc(fERBEyV{55xWS z7-Z*#UG>t20p6E*T@+7Kb$aFI&r9{diUgLUPjh5_TkU^D6x+!l4Z+|F99|efPwSM? z^>rq_=m)ZL)~((X#|Co)$9dfp5d#lE)MrLKb_2d5F`N=mBD!P#7rxl<;=^=;~-Sxvi z>cf7SW^eDu-fq|*5q5WgeFhF!-hzBPb$=TQ*EuYC1%~B@jvqo{9X=emNDJDQZwNb< z*KcQ|c?A^u@gxKr)w8(Hzb^C}w72vjC@{=8VGNuCfxtaXTr_c)*|;$E4F(RQb0cwG|La8#7*2zHB9wJa-O`W3}yip%s;yCOVU!42hC;DA7F#f^kj zjPrkU*igKU##HW@*{2rq44%H~Me4DCow05S!(%b|c=WclhwQW$6l|3ZMnvxK2wO)~AW7I|7kJ|FKk_#&D|<4+kx5o(T%wis zYnPRQ|LUY9tL0sn6?T1+H34!e9&=g#T`nsWvg$`6j;CQlj!v>N-g8+Amn2%Dmx6af zqNVU1J}}8jh)J?S{{fn~BrEE&BrASWl2wavJ^oi-o@7-a58dCotk$GND{fMv)qHi5 zm4fe07bjY^$%$6Rf+Xum559XLFEPn#4nuyBuT9q_S#2nbDVa%D?hlc+Ym+PsY2xaA z;EiZEN^X$#4a#sazVN+tseA4%+44OU-!qo1UY3)Wi*SfFbXnd~c{Qmp58(mUNqI~2 z(&TZanYc@58CK;B1U?e*xvTSTn~}R@_02iiAy$Mn8I=~6h}V(k=jQ)pc*gQItMpZK zg#)dw&B<2t3cSmaKSSzvNHCg}KjrO2E7uCw3<)ciVv!y}rwVK{WXpA?fB~ zA$!7+JdI|y=!I{Q0`pD`M%-KAgswM>s0p#_iwi!WB{njn-r~jR#u}d4m8HHw4{=ZL zgM(25wy-`hu`Xp2c*+c%&k|9;55Z9NgFAYAlV%rv>NN2INGFH=zr<5d>_|pa5A3Ip z1ri%(T9Z^@>WcMmQrMSdRIUX<@V~sl>DIad0hkNn7)+@DuRr{I{o!J3K1!^A>kqLa z(TeBevIw{RP@3)pY}~HZ**1_pA;cQ4fgIlo*#|Putf=v!+{wmz%Nvf>^qH1tJLb}b7H3t{1YVJeFzB=!cGB?Leg!1WRut~L7aLbLfE<;X?FUg{(1yF8ccn_!ou4YpxlkXH0%v9 z{hIW5uFhQ|B&B=G?giDC+H336M#)?%rkpf|<+Yn)k67Vp9vsUFXif92aVgnGe z5gb-#^NyDcJf|2c0}BV0n9q`}Jt~>^LQq!@=}Sj-sz;a+4lfH1W?#J34*KAKWnnN^ zh6G^C5nhK9`afO!@9EkhRv}7kF-k1h(tu@ws?1!yWNBVbuCzBc3ic;fcAh|_QRFPk zTY}AhboQA>&1!YwfZd=SU=3NeYAGB1TH&N@ZKZ^>fv|3g)P@J!$D#XYu&!CRL;8@g z_I1-3X>-};M_~Qku|a}vI?RFT&l@jpz%On51;ZTMV_;nY0_suNw-KdrSh4aBtSctO zCy+BWq>_+31VRrP&}<@Pg+RVR;c;0+EDV*ty$jP4m?8zpt(w75|9kh|F8L%(Tj(%4 zekf_{uG>X{(GXY^S;y$S8(Da2zzG82&;kKNcB9XU)zS?fxVhBrqky+DnJx<55pwv_ zzOi-+)6m^qSf#1cAWWTg2g&p+FyWbTtdc}ZX_%<*dID+ZvxWEdfQySXI!V_Mj!=X8 zU1HEg;RcApR8=Ja=td1Y9868o@<^ug{yewE`Z=0tq~Mdop$5wCr0sy~~~}ukxC?7*%5Q+8NSLhkO?q z8?;u7C-)Pey8v`!%*a6dW}7dKNVj6~KLP*wZ#jOc>Hn|I|9fqIfORWM?8G)dd{xe> zRNP#PSwi6eOtZrxgQnRhSuqF>lL`HdycNrCiC~?>9WKDZxpz~^45^|oeb*IP-`eOU7ARuBGq9niOO@3HEiYb9K%43IoKM$GCRkf zAyQcmv4$18Z#D~5n*a#07>NOFbpY}TY);`ehs6N40}y5nUg};wEjxRM1coAzfFg6} z>=O3DkcWpr{0M}K@<%|YaZfNvXQN(NSn5Gh zYjDbvr8#+*9Fzb{TDxhrihu}|pAKuWhx$Ra8ki*V+|AG1|&NCmiXt7|~9nt%DZ<=oFLyM_K-h)2-pUC`HX9=)H;?4zSbP08p1)fbD}u^#NR* zy&KtOyv3!qT1<|3^d;{`wiIg5TxX&1LP+KY>=H=A`v;S`P$;(|V(l~Np7rAw<04OZ zNa1NR#L#^7OZ_U4JX*GLJhne21^YKDL_iDI`v_ZkZpEqT)}#aAX;4`OU-#zLN?2dD z-Jo0qZPOs6lXrn%N|0ZJAb_B=2x`(GnIJT%aDonM5bb18eVq?bn+C~@ph101P^Sjb zV*^xg5@eypVCRY(f&kSM6sbW&HRyK$?H-SBN%&2(5W;mTmYwW51Q0C?s1WfZ0?sAC zBzXb>bl4UTOi-Ne08Da+5ipSyCb3`71VCajNmUNOB=l_pgvBJY5diNaR1Lx9+_@V0 z8LRVyc^$L(SAcdW;#=}_59Qp&s1169$YD3moh*DpwvBR<`^c%Loa<~kNtDBoE$4E| zvG?%CUDSUM56*6E8LYz9GV{?bg+=!Nhkq&8hUWM68_in_*^HBgKC^IoHr(tb%n}Xu z8?|X{e=vqg^RM=c(MK=`=dq`vL5xP%Y1AcSZZ7hQST4wIaP)51~dkz#` zTJl^K+WUYF=cDJr%Tvm`KJRPz9QIharM86FWVlTZg}-Bi8t@o)U3U^zay(?iDcUo1 zrZ9Ph366?my!Vp;)Qf+EEpk({Zq$g=(@#SZz^hmNAGm_uy(W&U{^E#;CrG(Bul7!W zMxig1Rw=(2kD%Em-H2Xq+@Y=k6}Cy`-D!0k?GX{PBJH=5u_t~l-6-&g40Av4Y&-Yf z646vY9S5)F2mXYV<^rX<-@%6RT?pbC!uG!$=YEPITtLEA4&iGgyb(d=16eXI!KtW1 zwAcyn-0$kbmu2|QB;REY--F~k4?*71_cO4nbmG=B^1~kk9FJ?6k=hb!O?An`vKo-3 z7F~&@hYO6zKa7RQ4-VRCPN2v)5v0hAb)tJ+UA?KD5uTr*{cuU*2&u~$$wo$!7UnIX zy`U^c0DLp?HN-Es@oR~1!_CfcE{W@#hjhd=Gt{RhKm$XyAt3oDXXrVQml!1P0S6jq%M%fg8?IZ4k0n=R z5Z7V{`c1n@yTs)-5w|kpn@xcB2=2hwsW^|EQz@?=oOW46I?%^$c_L!0;p%(?Tp8s0 zc@WoM9H`solDLl6bm{vhyd|}a`^==TO)u8rQ7h1s-{8{B zZ<`*m6pA3YM}Yo9hu%l}7zEjD*MbFIU83+-Qi04;+j74~|Levme-W9abvAtnx@7oJ zVH1;=TgL($N$ff%;c;M5DrW=u?dvwMTC-?P6yW*`3ChUj4sgBf0BToVd1< zpoUym2e|HWfae=76kIUZY7%TCS6F~+p#%Kl1Id&gq62YFA;B(ky#WG~uX7#XUc)8h zcz|mF3F^sJ8{qo1#RlGGxMZ*oa5a;lgPh4IXk(Qm(npNckqN@#wlf&{0v zN;rFYpVs=j*AR8+xrjRAEwsKz5LADJDiQttOH^9F*1F!Ie~+quHG*uduYiTEl~LHO z^_v{KwHA{}TI*>#D}7q)QevZ+gq}8?Q5hngj0R+?vmOm(bTt&Y$!Ie(de;mmqY}OY z(Fb+QeXk;xv5bXd4MwNZm!wJdsK*^lIJ5LHg6b7$knbyk+a3Bt$hEo!K^DP&u&@Xi zxm^TbW!puto=j62{i!;WeTv{FV$+EI`n~Tef`CjFLw7$@*DM0ZhFA#Q&IR#Fm<}{_ zEQE0&=PKx)1u|LJ))N|SXVKQ<^cz3Un)Py-a0l?gwjjGlLC`zeY{CWRU20nfI|JUa zT#l_9k;w+TEN`tXHW+4$64*(gTb-Y`VrikgQ`v{UAFdByIQaB?l@5!@3&0(6fir#B z(s$muMos;Xuy2_z^ANVAlL{=@-i<)mOyG?>q&}? zS?;dgBytu^z{b_`aUnhASFr9*7W#u(>Su<2 zFzF*nzsaG8mpJHaNWXtOjM2=NEH%&2zlC?1>c*13z@cvzdNEEP6#C{Ybq?r#nN5Q6 zQ_@5Cu+=nK?l@-a9*UVvG3PsC@H7yj72-S)do%ZCsdp}*n0mp8-8oOh)EhC$6q8Ib zAHay$x!n^W9w%bGEHzlfY!gf?#jF=G+l-h(im9TQ5snz#QH`<@ z;xrMnHA}s4KFem4V8jl+T*PcLVkS_`c8Y2Ivt2f|0pg(|rZ!8hg&0=JzWt!zNBZ+H z*r=xwL=zt+95idaJ7gAnbO5~C?{0*VhpuVHVO8eve)31~-p1fTin5zaif;;Mm*a+l^~V_&GA!N`e6qReDi9%U(6U&Z?qQ!9gkURR~CUd<@m z5#>U4hp<+d1s=m%A*^M=K(DJzSO=1|Q&{7LwbU#H8P-x^Ee-~HUB$xM)Cg7!%aRM# zAhP<_K{uFnBh9^+5X(Km=Udwkg}eFy5ixgCOr(f;9!7%C=O(RKsk(ql_7WmusC|M_ zxcR{rb0x*Zh?t*<7+(8l)~HNs2oW*4{ZL-Hq*qe&#mf*gUc|(Sm~7ID9c!nC5D~Mu zA4)$3A!4>u%oGvRf$0XWupuo+Bvb1pdkGOS^f3=cdBy8o#N<#+vWWSWh{+(WUPUvR zB1FWb1)=mE?1YGzGbtuZ#BlzlHTg8UY@_KP*au`Dkm^E?L3Ic^O<#=5;HFQTH>m0R z9Ny2MO4SAi*HKgjY6D9f()2|Lnts^z()4{PNLHZr+s{IDskJ}0 zN7Q<9H%WHtFxvWjQ-SH5bwY$T-HvIYx*N2CtUI>uO;92%d3$VrVHEFqm7)2oH_mCn z@SGmi3oCg38L)x_hiabyn|}YHjwX?sFqXa}wRN-?)mai~78RmKN#LNq+hh;|4IM)$ z>qYHN(h#tjzt5&-ts+BWciYw}!~NG-|2Nvz%#*gWbs3Ow&ea!chTBFLoXuvNb{Z#wd`k;H zNwNhQi)%WUui(}yU%Z{RCMWi`{G!;xBJ=T+C9B=MY6n}p*sqLr=dLJ>UB!*wYn=9M zw|SjM?AkMv{y006Tsg-kPBQ@hQ0&&Jf``74_4A0*T_|a@e0?f2brEt=7eks#C>3=U zgA*8>_#!gaimW97glqrmrV{#7+yx6*9AJnbg`hkQIzxjN5wuW)hG|e9L5Ujl)$_tw zOwc3^+73`%B>{CPU!u{h}EZi@mS-7$%$G$xQxzoOe zcw$%|i9q?~#Bv@To4;JXr6^gxOR}>;E@jFy8Q3f49YsrYSqF57UDlM(_9nQ#a35BXB*OY>ZIpVV?nW%*=Gu-cFf1HL3|9P&4+T zT+6Umt9}jrj;j--sbe&{?-01kL&q9`voD%}=YwbCxco3Msvo`t9y#|pC2`WHfOhQx z;7=+Ya1~3@H56UP#Tc&T=RxO~EmkbdPI1jC`hz#hjv}o0-ZsQ}-3`#@=oTlmYnF9z z*)revD@xRI4L=&o<9K@F`iAgH0pFC!$>~|+`rp0niE6*r46bb|$cDFv(ZQdShY*CI3s!V3#h za+bT-Av74FyrskyBQyk|WlI@xDMDIwMt*)?VHtv9)(|&NQWfN^=Db{o<}bN5hpPZX ztzk=+_PA(Yj}Qk9(1@skWfTF z91+?FZ+I%gK+Fjn9)=jsmf&XDOv}sTd5GcGZ~$yEJP#3O4M$zr5FUllG{z-Q&O&G! z8^Xh1qu|t3unJj7%P%M@hy_Gt&mOvN+2{>_)Fa^O-Yb3f3BIUUnmeW)KPqs!D7Py0e@c@nxuUl44f`qgi zf8nww`FP!hj+2RZYbrzFz@(TDwONhn9Np2Q7!D&nL zi`03974Z@?Kl?ql-N7V|$Nnp@e)7jEC0e%WfZpm6HxvdC>TEkFtCL7xTIMo_an463< zR0g(PWJUIuwFBU2E6jG}+J)d~D;&OA?4r^!{Q^1(Alwud)cf`Tu3G``DX$l*2vFIL zn9zNIq7%a%jiDxlqOI^5`Ky-ZPtRY=GaM7GF;+2#z)`_K?U{&M%7I`bXZ^X><}536 z=R{eN0FD3<+R}kV3(VFW$tza7&$Haq)2*}mDS`g(ZD(2)pgOf56{DjU+!(8V22zH& z?6&1ZcqmyXg8e?TARC9DqOF9P={QddePNonK06z2rPy%X3ZI8#O&Si@JHSut7xnxc zH_JT(dj5247YL&IYCO#wW$giK1W@dM8aCS6HA|Nk(_|8Qx|K2?GLVCykwB;SbgRIi zf)ut!oorPsO1HwzI4K@_W2`EGSQK{cnixh|WjDgRFA=*=vvY1^2Z*t{02$pkPD34I zO}I(pf+BU&nhhM&8lMFq{9ALfqpWsds0~EvNJ*S#B`g88J&vG7*%fx0 zRY?qbK#+#9{TqRC4o{zKg=V9Ck>tz*C%q{Ev8^*j1~|&90+6FgW`Qn71N=ynYg0+5TCvMf6ci+C$HW+IRpp`)18kIrfuCw^2b|;v zuA`2&_K`eTSxA1PtjQ~oOk1Z2>akdtMVoC^$bBIQg$dzXf> zIkJtxx71z<2+e@2JN)3)jPooDKJUS62!+=;(`(#9ua^$I@foUTy1i783p>PHoW`Yq zH`MP(bYpp72>v=#*V`e1Q`b=^aq2o{n7uCGt#2%DhIS3%{d@MEsm{4J``(nALA*Dm zt1Ry@hZi2h8is=FmO8W?dk~pNaFK?;8EmS# z{g|BDYGq*V$wYQ~@8ZCurcM3^8v{K$K{?~ZP^_OwQMKisrkox?eE{rJEoub^*&28FLyHN!~wQZUF(8FWrBqD znk3#yA}B+HP^1FZ}xLzj6L=ORs{waWVe{4se&Dbstihe!;j|W9R-ARuTa0%0MR~|x7h0tATvC}ku zg<|9dK`36_{}jPhQM~^?lIl~Yh%ays@Axlv=7wJ=-SB@Aqf^7ecM&{~FCPy#QQZCmhjC;O> zxqaZg6mMtm|Ic7|rz(o;ZSDR`NWz z%LZ(iATFP&;nE~(rqfTf+ropS8;MT7$`!t0m^U*Vwb!~1D-*(0(i^fN33oi;MlX7b zHmW7U)@8Xb@jgH{fG#Js@a+Q9+r4`a;@1srKet6<8%w0imaGrAHq5+gCmVFpnBwPJ zSv0r>w4?LI6g+;N&&;3~lPW6@?Gz3u~a1Sx!oCfg(qI0gH7&L+n zVaQ-K1al1qJW^TiY*#q<&$8TIjBn#(;M~Y@2`n95Xx@#SC1J5=-c&y5brK@SLVORF zg$`YZuB|^kFCODNA9xs{TfGeMVcc0g1vK8#aqnZLbd*0C^3*+TP#zw_({QytMLa|i z)%?s-A!xi_!Qy@obt?QqP1MDuNFWmsl}y*vY$OM+O^5co+5yL!Bn!xP+wtGd4URVI zA)Ri`oY^j$G`M7+i9!zv#dWe?3Gv-!r26Kwai4YuQi<#9NrP7*CC%@=cMP{}6NG!| z4fBv?xJKw{hJ2n0_$wQb>T7g5ua99g4ZI(TU7^_Biy={0zJcJzdUE6e&U7eTrRwz% zq>5f<8Ag<@MLY8OVuGn&B2_g(K2JEdRn+dzqxR>lqetP(+ktSVGT4D%I@oM{s=35! z#;Knpd=0~F#hJ>#jurD#B;>a;SjON^1TSozJ>LQRiuji47!ww%r$ones*MItVPg0fU6IzUmD zcfG=jSR*+Gsv#TDtumzNojT zE4LM7y+xgPES0ga>#G!&kx#sS|MFNevc#|@5GR|b8@ns1I3u|JB%y#j@W;|**uer*6{aV`Fzog-&~Tp26l3?I^y zeW1%>sA_#ETRmK*Qj7EGW71>cNuuXi3>NMIeBr>lq!+DlQA|E|1Lp z5d?5(o;!qvP-NLA9BfA0hO>XQ?YIC}qe;}i4n)m;rPOd7Unt?Ip+39{0}Q&L3>j)B zBsy*7ZH= z&ww4ijE}q9ihc)p)NlSmE3pfgUv{cz$d=ierOqD8&eg?RPp>=^u#$DigST=qikq77 z)ko0epo{T(lE_#J8MHis+KEh{%V>tc3Vu8)+sW{+5HIh)W96!mlIzIcqZszIk;8ho zZ5)nyL4I}OR@dddY|n=v-)a2bKR`A)CF?=Az;jPlauQj@TeVsX0Dr% z>wT)8Z1j`55RKmJYGSSv&Y-9+Z!s4{?A;UWyu0eLciw|%o*P}Y!y8?j7B#xI4rp|3 z!|(P1zRW7&krsD!1!oLZ<*pr#u3f{iiP13?m)g7hjjlZ)tdW}@{9BopT{(z0v!10_ z1oMB=0bHyl$I4FryEs2EqaUT&8N~*?A6#@^c(V%|GW$&6n=fF?0C*mL>slzcYpaGt z0m3V0Gb;nBOOw>m>!)2MZvjUeI2J0t2e;@6IM4CbZQsKe3_*pj;mPe4iQ%>;;y2&sUogI z=!%67i*S~jFLZQ1YF8(dE=B0FNvB_;X3d9^bUaDr8ET>aXfvo63-#qfP46S`U~e&J zh3eazNo*XF+LfQgZXq5j#BM`eK;l=0m>`ktC2^?`A41{!s_BqK$rU8t4C0c#1X*sp z2to%W2j>w%1c{*O6jUXG?iWFHQX+9B1!ajKf|-AtH#5N{p4eFsc#6C3^`HLC`<}+~XpMAQ5yk z1+|GFKdQ}FO~)h(s->XyB8VUnMDHL6w?qUHB!bSQpl%VA&vu1&Fr1)pthcE#fWR!3 z=0eqt=`qw^i5dWd_U=c~Aj@4XxF(t!DnNtj_m3~97rMf5uAYAs!lVy2qc&jw!kiGJ zSnsW-<0@P2mBia~l{jEIK1pbKj1|-ISP1m_=xPKqxy#nW0CI3hRUwA!7OFpOKi-QA z?VrL;#J#C4`aW9b=0{9GEORqk5&&mc$Q9!|I5)gQwO?+82D#aCnaNG7>Vz+R-DC1@e3&G*Mn>|DUSBq+PgqA_!!6-zcv=MeQ1}LBSm}zV2T85$OE|lL&?awq_0`+== zf0+c#X~XddG<00RwEfne%tN*_&hdK`YJ>0O;>jcaOdMCJ=k#a|7V)%oVq*hyakJGR zIOwWAb9LHL*a*NGaZOJ=7xVEW^z^L>+9(hh{UhN29t?J5b8o=rr4Nq1}B5^SN_T7K@ zbYNJ^aAUQQM`WFRb3ch;_I9R^zp?mFUj=RBnDzzbfaB%*Fwph+U&391?+WxIir;Wv zUoM_xk(Q`$!<2dRRh{b`+jKh>TR6nQgM#m0?&cYVK4%QNXdQH2XIlqo+Y!&y(86VF zUy5TL_${*mrr8IQT=5tx1^2$IJ+s&^npN)a1E$k9!1|g_;n$=47PSOSClA?ZI&~iB zoJmZlp;0gnZ98cb>?7Do+CFM@?SP%M3%A>Md21xw4UTEm;!CadmWY8VE}E{|a^T}_EB#GTHE9^@CP)CRzw_q`Cluq>$sEs^vegtSfWrBMMxf95}8QeH9mrUsA z57|&JplZNV$GPkhEs|+f>e;E$KZg??IIL$IcnRhFmU1#EeFoDO9~SWp&ht&8D`tzs zWV0}((MTzeP}o`DF8OU&<0&Ycf_{$S!J8H(++v9R_$FquT@511T9VuxL?TAh97FN} zUNft!AW1?Hi5N>48j=@CvWX;Tg9PPquH?gk4i91!!|m@k>gYF;WCs})2Z6Mx%{27A z7=p#V`hy|6iDdO8d$AvxSXNsN*%Xqskn9&ALo&``GR|?JrJ5O~Fo;H_+VwTtaJ#Zd zp~$yX^G)=LYkj-=_(3s-1@{(AI&Wr;lR~l6&Nor-1z}weMV#e`s1nm-ixwfc`$a^R zBSI{+k8jXraXUpsV@ppR`lX~EsnGWNVl6^&X(FQ15h1qO79-*cikM6h4>=;VQGSLN zA-EADqQVg&R@q`BqU!;ONTG-YjtFh9{{YU>Om;`bD>m}DnI zgjiN>sun=?hljz26&+CsV)dx;!!b>!dJxM?PV~>h)ME6+pi_qEnZ!!}QTGoeLz|jS zfwx1TtULZ33IpqowA1i~m8K(D5HozLX@X;@jRqHx>c?O_!Ay&{4I9P=!=@5^zSL6N z7;|x=aYzk=i0jn0#~>&<%rR(UVU;y#!=>m>HmWD8Q3`IB!iZYN1&gdzJpiD38QLRI z3ben}Im2`*h{dM!`9zp07%|YCg6X+1s9;)^ivrycD5bFFdrCp#cnO?huC}TOaIq9_ z0pkhgU8Y?M-?pj#U0aE91>0Ev%69rbTkU_kO=a6p>S8>MsrO#x(#)Ve z4OvLL1r7>kPoqKo4VEug+c$ulE6x$qX{;#q+_r$R^6fNjth77pJf#q!n)cIJX-E5P zQ>`G8LyI$xiK6E^&mz3ru-X3}2bn=`G;o**YWo*QZ5Yjy9#l4f4EN{TmvLtuhC0*v;WRMXu93i z2sCuWll)z$+x6*puw%J*^|iMZlfzC3y3!R^G&|ziA1M0Da}HW*>k`Kg_|pAYV#f#*zOIAYuMk-H@y$v5}VIkS&C#uJTvcFZ}C_pKqW2x zlI`4E$q?Wx;4Tdc^;t$2;hSsTWqsQ1jPLq%7C$d5)b1bd3|V>Z?k@Pw)P=#x#ol0d zO~ye66wxWz?kGCdyOHbHQaW9zsKbLNy>ocL&Jb^d_PI85#Ms;=g|W-@O955}eC6fb zbD=!ZD@P9s^ci!|-I`+)UNmA@LcW|@un#K~61y~KIa~p?$32{&V&QUv6ArQ0u&l8R zj#9e<6Q#1jQjVzW(gQ_<)L4MH?NqPM^nBKAmzUqDPJ{1lI&XN4xC@FPb z&KJFUzhV|Da8^$CidefKjB`}}8t#IRUv_@%rEzhSCgRU!v2*iQ+`1xXP3-(7t5@?E z*_2!g|IKUiiwb0)0aL%LBnL%f^lCmY1|Fqu#nw?{33rA=4xe?^{Y-DssXluH7zCL@ zz@6a`G*7JU+vbwdF#*32780j*pDneOpsD*}|5oG&ua^vhGBVx2lFl2OCx{A*c*aZL z4fV`Z&}tgwEzUzq&@7=ty(OX}wCg`S6X3v~M)FBN#0af%W@;F};hOJKDBZydC9|75 zw?R5cJ?28amoNo~WBTD>IFvis;^#@K$SKP7Q!$Z)_x^XJN(N@P$R@_QQW^q0N+nNm>dp<^gz}-&v-3+ln{dfH$(4O_X zlu%!P=Os;#xKXga(6ccAFRexd_|)zNv#xq6qO=4Md(b%hT@D)Etk^G*H8Z-s2{(i* z&Vg-*xm-6iQF@p!>MX#{C9DbdWTUFbCxKW~Yg9W4clDV4AWi#DZ;=1dH;~P(pAY`Z zGVnuVIuCzh|4RDb&RjNzM(^mUpUt#X>U-P=-2ET)GjSauaWdk&t8-h(v#@OX#pURo|hPE@&1hE zUeX=1VYv4`uFs;lv20R*c)*SjU`vYGuHU>t7EZn+&kJ=NQ=B;R`owV~LvkBX$tMG@ zs$^8Mx>HK2>$OyGz4}SJ*f89I!;Y7%7K~5RH#*6z`g9YJJtQ;8kW%Kn$LDHF4pZuL z69{FX9Ra;KptlaAV;vh`Zy0OvKmO5elTq2I&*66@YX|8Q44Hu60@?M{Ef`rMo(;k1 zdQnk?cO$);Wz={c?c_!dm$JSDXwdqSRzpoUJFT_Pl2?4h-3y?HR*ubW1I39$E4Laq z%8CvR5N>XV=Hf=;Nc^F-z^GIKdMaD%Hkj$?^OJ$I`}_?P<-nePs)@Uk(Nk#lb*g=j z1kAorz_>-a(aC{UYwgqHFt<=ZY|R` zR45Orrdg{6 zO4eOv6f+~0ceIRiqso8AE@uyVw%J~Er47-;pv?pgAwmL{-xF zhB2+7;{)hYb8BJ4KONJ8?qL**V$VuD{Uy)I=4w&yca8IK$P#-&PaJyc4uVake{!_9 z=!bmIsYJBf2-;{c0!n1@>?cSV%=ts0Ow*v<3g30zWPJv12tKdu+=jtp*gqM6)UU7q zf_nZ0r?>`iAiwH$3|-t4KY-tcj?bWy4=cH-5m|QH+N=dLQV?|3=Q(dCEGt&i(8YjZ z1cm2Z{C?NjQE~)te6WvjZJ<9~#{VPp`3$P&;p~my$@eB& zi#Osv`=&%I8R3?>c=rwbosS0io545sWH^NbU-edkE$%=5JqS4mFG#R5O4F^{M+0(d z5N>@X!D_{C@*4rT9YF=sH~H}-s};W$yYPk_em6ahH|Fj_Gk*r}-r+ay~cxSIX-Kx1b*{VQz({ZE&zY}_rtY-XXpPFn<0RG5n$<`5sE2ERGaD?}aNw!k( zJ2p1i+75VV2;PoExbjkj@!J%aY<1x`B`4X6{W%8ARmo1O(ipxY5Z;DxmM;)?2>X5P z16|9XkPiHIeh7Lm+CzJ?6^7py{6^w;d;QFQT!COrMYK@2_ zA%Ne6aK%S+tUdVM`tcmA6~DEM=2~6&jmw{Fjju#IT0hrHz_0s>xz=L*R&1YZtz)=; zu2qBIeLqaI{P^|9r&$N_yDcZpNmnProh1n0i*kA}03VNV7oPe2@BG_(OORgt?+E%| z##=Jc|7E%r5>av&GNzV4f%S?(VVlye0s99bcl9CckOFV`B@_u|x<=4fS*l*c` zG^jfXn+zD|k|h(Z=y_I1;gCu7TSDCDp#IU0W*OH0RV@Nd1KcxqWiT>kJJh%D} zd|i&O;vao^>O6RgMffLdgUt~KF7@$iNafjZ9rt(r9b~7&+)}5&8C<>S#-BZTK@OPX zK;O{eYtloj*a-trL~%HTQZljl97a1xU0Mq7OwN%wK7SOHuB}3Fo4*vlD&Xc&(YRk{!&_f6aUW>pyb;rUCx%YDEDsVaOXy0~&tjSgGi~4`sEi2!>0G=MDG3l1~o$n;20BiVx_m&C_rv-ki?fEr$RF zp!rz<&RPaQYY<>00qp=dX)8nI@P7$PTiCfwTgk*Y{-S)BkNq6wTQV`lz|+ic7Jnm3 zK4qId`s(Msxdi~IT6m@BmhtO8e61X!zQvmUmc;<99Hc(ucQ(IAs1Ny_i|<_Pr<~fV zOW`)KC6AmjuYKOTe0LnPvHbvwpdjh<-YuJeS-v~c0bWnw)&MZ-6;LJ;xD7zC?wCKr zQom~fV21`sk%TWr32c2b-6^AQmjJLG6uYC}oNm>P$Dhr4Frd^g7IgORj{Os0arm>j zwhpk3fUztJ#4mK4|2m{1*$)P1I@Ih3835asR4?Br^C1 z7yHM;dR9M%Vo){b9K$mgkg3juC&rd~5cqRHMWknCGSV#v0bt$rZ$F%qO>7l$5p@%u z!+g3Mqk&q2#grR#`#5Bf2@Wy=NR4YVxI70p-odpST&aT#cW_E@WBj`sk^b_=qqwW_ z1v~1GFNAcI#}UJS#KANZBV%5t!G+e_Tss_Gm%+t2xGIB_ymlM(R0mxIwB%LrJqDlQ z;4}N+t@GG?BkJ-T{AGRcp@JXduf#+`ee*K1R_0I+7fOzU=nh8CCI|Z|RxkqT2sikB z4*rjQ@R0_8$ie@v4?fD^yB)l*4?f!9BVV+Oa8)0CjKNzk+4$5x_*jFFcJLGX;Kv$# zoP!_H2R~l$=a>8_8w6Gn^>o?k$(CxUK8EoJu)1W2^Ud>FGP>L*2;Ug>;e*F|)oC@y zdg}@tx+j9@;x5$nROMiOg4Om>$;8QmALEa~#7qs|hkDxXP%aCSGezjm^cO4x-Mi?n z>bAEL>Eb54SS}Z0sncAcJx2}s;26xRJcKOwAay=Y*43?b=m!gZ$;5R+JX^i>@v&b2 zrk^CkI!PAmWOMU7>DGQL^7drQKV=Q!VIRrbi@2pFnd%TF9BRK zv6(RZwwT{T@+nOnL+F!9tDH3V80lG`*qlG@AF8mKR`tu(I zxBVD{&wkCuzi#78CdL}%ItRH6NS*Gn23O_aY8>2n!9~?|Ik^RNXEI*9@E*{^+;5%-0&;W(U9B;az8N?GCQe!4(@^ zkArhNxKe|Qdc!WaEC*L6xH10vt5YrYCrsn&;vA|=Nkx0k@UL|+(GGv5!L>TLp0Rdb zs|>Ew!L>QK8iR{|(@xVq2UlxwQ{J+1+Z@~ugInz2DjeJ{!3|Q6zuP0}-Xme^;K})O zaOd{X&w95MybS{dd8&7C-B<%rPY_ojIP_)Cjf(CG*ig+v{6h$;eICRspW-^bo(y&S z_W`-P7}RPt7H$1a2zo~gu#!OTD>~-UIzSpaF0V7wN-ON;&F3Fl`NxE^cju-*b;H8y zTi@IC&B`N>CqI}m@$&cXTr>iDNurLZ%WAdDqV`<7d=DC2frBe{aIFSc=HRj&+#$i8 zZ)~z2tl_A?CBw)YA(vYWMK%vD2JEXh|Ixdp^v}Ay+Kjvkgtajh<;ZI{xUCMZ8+M!S z&&uGM9NZxXcf{b@99+G@i9YQ#=*Yj=QEmp>*l%41IoUy$I&!-WF2%v+I=CLe4N{M^ zAJ_If-q8#xJOg=7egXFOJv(4#h64rwf7GqToOdBTD=}Bd%-wTupjAW(>r!q=xUs~~ zox@17{1m;&mUj*1Wodc*QRhM4W_~rskNbb@y?sEJ)&2i}R5CO&GIG?&sLZ)yb-nMe z_dO~a7Ah$knJbVRA>RT4Di*W%%8aEe)|_E;jhZ=D&aooLij0aiYUIdVqcWq792Gg% z%$Q^Hdz|YA-Vo*I=J&_<_x*MB$?Kfgxxas%*SW6iEl(e*SRrXTN!LjR#?w8&B z((yN*zj~3}wfm2K+Wp6G7)HH(UsT_JT6z~ZwxQ=@pJsSop!Mar?p*^s6?UeOJL|a3 z=QdmMe_Uf}Pq@KKIGN6QP-AHi9>Gc)L#Vqnmi7WOteWw#N;Q`D{57mY6Jgz?v9u@9 zV6~qKD@|i*S8%YV#lmt+*0}B`AUAaPH64}5kgv@DK`k&A`Dip_J!f;XkbVZnM1;$Y zlW}54i>C2fG=F&uJ-X@8{1Zp_gxjb2OQpo&wp%vb^qHPZ@u}-p?40y+xgyKMc4c6kNR^=o0}J{DJn1I z^W%A?r93q(4bM+0hT(Tb6^qqocQ{?Dd*-a!DRbt^=S#l09{)WbE9qY-62ygKs)0z` z1*7s$l|%gf)Y~u{Ym-Gaz=T0EXa<^*6JAa#Iq-WoCW}5mkhPvwXB_q0kJ7rM1xom4-&x)pa2ylgH(_XGC>w7041OTgh3Uk1~s4- z)PZ`?2%14FXa^mj6Lf=K&n7Krc?P}NpgZqL)@=O- z&DgBFqqpcZ%b<-0jWy(|7K2vatA{&e(CYhix80!K|4o`wt;g^Ao=(LNblPB0Ax-2; z9buPmxtQ%B?PeQ{w3`!I^1sNg#l?RxE{s9DEW(JqVr98VY%q*bkV%q1!pJcE*UU)! zXyuoI&2q{}ru{l`dRV%pOe|r_yc(76vE#-?MV%HsUVe!jGj8032@~MU`8$qJijPGm zo+!>1llglN^H3Ik4BRne2b)nwlj%gAHvaVJ2}Ci?L@`csqsB>Y)L62Kii(b!C{7!D znl#a;O%&rLmuPTLmtjxWQivWKts6dRK6V1pCdd>f4jRhW!j1Al&;|NH^vyFxJeUD| zAPp=BB_Ir{K`p2U&7ci*f?gn2%@lFqEZN|)dRl`Ujxn2?w^Yv*JHT%6Uo{!&bCt-j z*MC6UVY+ThmgEafN!2V-vS*g41aVxSCPqAirbilc=KRI-6^^pR#d)QL`J<&o`$*Hi zf0hVCJE78YOuC^_f5Z(V4jSg)H0j1em2PM%w7I!iWJ2X49+Li8Dy18`MY>_sYW@SF zUh^LiEt>y;I0$V%)GWH7yI$!P{gVIhUJ=_qOVrlx6p2vzn64c<7Mcc)f#yPK^?^$0 zSc1D_rhTO}Rn6uTw;`=3Osq=$bgIwkFTO7ueyH{LDc&Ltf>I|=&fzzLD8xqC$> z^hECwQ34$}@v7J;=|``MT1mTFM3ba%{Z_O?4>W8M-O|la>6dg1Z8Zf-U1vZyLw(RN zGz0qT^5vocdLmpZ!q9=+)5TUv|13nEq&ZiKCg`C!pJ<0Zdf8=s-j;j{r;2{)v7K2W z?rVgry;USZd&8`u(*39qS(46Su0x-=_+qgIx_QnyVkfkA(YHi1^wqn9;vn>cZMX8f zz9~GDcpo3BPZ3AE9~1G=6DJM`JCtNaCiLRX7mE<|mjhRdD(LN0Y$vq(Xtik4+y})$ z=oOo<6Ftzk9!(Tc=TWXBTSNkM)xDPp1u94{75d<-R7+?F<;m6P?V>``6Ay~5(EFP1 z6AjSBCms{+&|e)r%CosCqLYq_{yO#PI3g0Ecke$TRA}yxJ{B2J9+nj)&}&!)tDvc` zwTT_jjnh5L(}Pgy-O7{Et{9Q^d@|_e4BYh*yOIJ@32{kt*H$UlX~|n;xna zVd>tyS=2}x4vTt8pJOkBPOTmgozhK(`ZO9AF&CtWt>Sf&2;FXN6Dm}$N$F5ta}@>9 z-=BMz*a&^Q^q$NABATI3FL_;bKz~^BHfJz7{=y=5D)HlfD5goe_j%!i9=+qJ z$bi08@`fmYzEk^-sDySr*CDE*1BDHuPSWN-h-PSg%VBX4dRxI!(Fuwvgu&_{cLI=9u6MfKB z|7H=Jm?ExRxKJcP4;?xrQlY>2#VuH)~EQzMW z*cc;u220ySBjf1IRz^aX{Xxdpuj2cWvhDyD4ju?0P znP*HoYn)c+l<*wE>!AagP<~rkr7uWA%15FHvY7$E7Or_hk;B? zrk4n0Ig^1jk|)E;ev(GI<-9WIlAK@CF8QV%s}@I6$=}30{}HI-&ocRVl$d<%VUr&Yi>)Rf`%c3y_pAoPK0x}dW_TPOCLepZ$!E{*H~H9O zo-@kIa7;Apbh}UtyFAY(8+Li7%{0Sst_>M>dA6-I>=Z#%8}{usA!-e~4ST&A27BwE zJzpF$?bNq-F#L8A)vTAzM&x+IPE&~_!#{k({sXZ*tc)rE>aD< zl$n;BcG3))b~3Is>;w_jgZ2SYXV_)?HyQTrwtUfU*yR}LH0%Qu^q6UHqYYos%Qi5u zUBnsowt+U0G-w|XDTaM}+knV2`P=#0s$rMop~|q+JOed`ow+!$+pse~2U-j}>%+hy z!ybjb&#oh}$TtJkhCK%RZo_^i z_7=k~^&TCD{VeRghMhHVAgV<#gVdG88+NH*Niyu5We1WCyVS#E8Fs1Ts4(nO&rxmI zrOsrhVV8Q8M#C<3Gi`=l>SuZkyVS+R{!TB0)UQl4>{7>~8uoN(9cTejJc(?Y^jF}6 z77)$*hNekvgAZCj6z?CJChm_{iE>a4+QCQ@{_9nu2Sj)A4k0kj?)R?}u}7{FNuUIn zrhs=B+d&Udcn>ks)Zj`8VIJz~tfB7U5%C_6M5ZBkm^%IwhW;*#~Hg)0l>O9p3YoQ%@! z+`ReOrK`v?b|HR+#FFV1$)8_2BfYdZcMU(MX8aZlKf-8mhO&!UT#}blm>tr-b*g0_ zlU`c5mKQ9BIE}pTnZP@qDyRge>B64MJD<6r4wxqP{8Y}TshmwyMF%j=F`jW=o`4@{ z0wYcT1+?qbRI!8iN24xE6^S4h3>qna7&1r?@1|z(K4}SP0H#T>q>3uA6LfxV{#LI2zF%(DJ3DW4r$Q&^NIM?`2gyj7fgv!L}lzxPf@(p#>kZAa6vJVTFCd zu)+Iw1kcPP%jn<8cFu>VjUh8J;;%HvK?JYB=(osrkxwJAZ)@=(nz;oY%`%Kv3NLX4 zufnKUWP0o2g=M&iadoQ;_Gs6?A|eAU33mgLkL$jRn#K{UEwZPfxZ@w2?5)B8Pz(Y&@*J zyHZ6Ti26C-N&s;n0Zao)zz&juG=0CAB?S7Wcn}R@K_XCr0%m|@AkAQ2*cr})OFq*= z>o2)PnB~H%@wBoTOjFMy=f)SAa^8fICg${cV%o*?2JH&=Xx?&>M%G`NkyPdt26q5y zq+8mVzT2?|D%A{FMH;Ks`GO7EC6^SBQi!~OP)Nv$>arln~nlUS2R@S6p-8)ed z_Trm>7bxIT@eOen`jM#U&CPv3zFI8bakZ!bP2h`+@3d<~EocH_JTQ#@bk0?&^RB)o zZT^CV>DMk=oUvr-b(z;M%U+R_o0q?`pz!8Zq18pjCAXB8m9JU5u44VIL(leHex)3^ z|6f61L|KEl?Z5$?zy(y`1|HxA@~vM#__8|Ut@XbgBa!3R9M`f-CxD4S$_a9f=S(K= zpyj=`w!U-bl6TqKeWBD%NnI6ZDS7WK@1Xff;x8@(=O%gIE$_PJeYCur<{2o#$P?ls za51<9OaqsK>EIh+2KXkp3|tP9z_-8^;7XtX3$OxI6JOc}U)DZf`TgJ9cJ@ivh#jC2 z^aInxpM8xe2i2e*n5LX>(i{Z6z<%x!KNb6OPy(vJ4$uHvKs)FJ$3X0qYeW)A1qGlA z)PYve19~sHMx;->Mub2;Fij)hzKQ3%H+E1CMwmr~p-92WY4zpNGi@l!GBNAi}NJhz@WJ*k6wHlc9#+71UmwCi+4AC21lPm?k+X zP1J%W&<_TUS|+5vE-t_~d_Xlg2u#zuI898;NE68*3{10yZ~JtED8B8J0!*{@#x&6j zVs7F`jDcxt3$fqKcYi<@FwNFV!h@La5FVJO=LOk;mC zO>71Apcj~?M42zzK@U(Y^G&v><=aC2Af9gvEeED)!XD3ehU}mMn5IMW`0h|T*ebt2 z6k+;tXYi(A31|TSQ`3Fze37zfzQ_W#AkxS^!W0vvT{lt)NCa}lHDoY@jtnc~^lh2X zH>T!`a?k)w6RP3+N}vl&lQwviHUQONm@(y% zM7JI5ip%Nhy$si20NV2dpqAAlz{s<%YMAOKfd>O|yXPOqMlmkp7_iocj z8Q~V$0z^#2UTWC&5l1V*mwUc;D~w&r3#MJl6{cOv4Z3}zCO>F)I8vrC!(49IZQR8^dazrDtSwy-F9&+^ zt+D@H1`WTobHn##CeIgtvPt&*J>RaFlS3xCKYwy>XXNn0@4shcNzL=EyqlK&*bS9q zzXdAgYm-Jlvp~dy8Ndh9z;X}*m7p5z0J}jGXa}9(7>H`(n{Hqlu!9tk2|^$Ys=-ds z2--jg=mz~D=Gg@z5!gWr$OIu!3ATbd&}_J6`F0+luU}sv5$*E{M0hh{+1`;xXR`^1Z!8zP0BAVPKk_4YcV~_<<}CY0Pp-o@vi| zb)jej-5_cI@bG%vG1G)UT`UI`pb41f;8p3uo|-Pw!B#Mu$!tj%l|Z&bEwly5yt|<> zzf0H7h6*$T$hND1)&ObJkEM$&P!2YNtsuRV`=?FGT>dAE+~0CXbPvz3V^7@({=$7a zel^nnZr<@AY$f;Xjqh?_gpMVF@5-sYd?OM6s>jjC>_-10(<5FOM8C&fKRgv$f`1lw zU198<*f%zEheaC8NiT^sVhI;d+$vB<{_>fk*jo7Hn~HzWZ%7XsO}V5FD3-KRDMuyg z^ib{s(v>0-2zhZ+I>z zem&`AQEoeF9|B?Gw97cuA(Qf!P_91m6od)kKaKRWaQmbkbP~RrGWSx4c8~$D51I+T zi8?e>)&$BPMP6ajRb_g#O$YWv__vc*Jz;W5Hvv>rp82w_giph*knh>_WhUXevG)>o z1~hj!-=!p<0_+vUDWLvM#0kNd?@ZxmF}lr-MJ|8=j=I zoVE~zuO)mU<*z3F62dpYZ^d1LyMVF_nFo2rQ13LEH#8bvrYw_8i#VyIlSMj>@KxOH z#EYig3n;@5;zSWAmNa6aEzny0%W1z3`nivCClW4;w&}YwStOH22IWkrT^jMLBi&Zo zES55}D*kX{{W$@jrZWE#Y&ru^~b zkwsbh37d+&27VUfS?WPs;H8sh95j|N7386SM#A|>Z!7icAfHa!w~n&aVoxG$JZU78 z=Wg2O5MesWr;BfzZk2VSo#e;Qvf!1IPdee!i5Ew>FnKnU&ra+I37?3&Q~J?fC4|i) z-+JOUn}Kl zB;0c5W+&mI$+L&JC5+E<`lCvQgWnFn0$v|$!*a?}Bin-cCn!%B`DRk4MB3Fy+TG;U z4=;&y%VnKqJ+P;cZawxG)+U8A$KXCh8zo~;!`=r~$*&d6AbmS=J4q{(I;rH9%NI3r z2^R$v>R1E6kFvE=k6g;Og}$yKjS}K#P>w^iVLah_$y0vsGnKG4gsmf92VrWVGf1}= z-cHi&AY1``SwY(h!m7mG0za0rWKq9(>Y7D6g(*`#@#6`fL_SsU8=%w3qnZ4B@vneZ zkZuEg9Y=i=$!7~;V&ONDW&v>;Wm(9hT-Jv?(?KI;s-;h=@GBuq3~kUxyh{2)e%~XC zIwp{wd{3}lmK%ThWzSC16|xVAAM+S(O59k|3&Tr?mr7ad2@^+rmAb{#S82qp1dWuT zny|efle!*+SAc&9;ii#yh&ToKwb57A)VmdaBeacjx00?x9=(*gmAPC%-P2?{;Gami zIxwT1ZzhvR9O+gNb_cYU@+DH95cWjEZzZiR+P;#yq!OlrbX3aHL6~OJ?vi=Iib&zizD4@OVw0#!#7UB!a=c8@fNuvtLcQ)H;gKGRci8q6M!^9D! z*GM}E$`?(UyU70__36N`m%Qz=ETol8-8w)O^-slJfxU)!6@7-*%WUQ7DCWSi1 z5~q)}r^$5j>m^*3Xteur!`Xe0S;PtPVEb8GkMDRR0lSMPUwg}!{cpdOM zB6vOUy5Mz1@XpVrt>BGj#?voTKoXE<0dxf@HQZaE4}m?P3A_TN>4F{w$3fKW$s!J1 z24;a};ARj8HDC{T8oUHLz=xn8OiGz7E(R*N8Y}~)U?aF6>;&~-A7}@MKp&XM7&#wI z2Ud^*GQbK@0yY3?9)#9`y`aV5bwQ7V=(+R-m=2s^E?5TgK_#dLb>L}m0Ca+0F!n0S z4K43ZEw}@01v^0lXaNVoUqCN731Y4$E>J)KWPmJC1S&xl*a~)mM(_%F z19X925Oodh1}+9FNCitlKBxdy;6YFa_JS9{VbBXi8eGbf@<&(*bVl9 z{opY85F7_%=QGa0G~fhtK_&=+N>B|R1ofZ=90te1#08WYTn1FI04xI~U<0@x>;OAK z184>ZK^Hg%q83gTlR+Y|f&f?mmV*LN4(=K|R<9+Q1>u15SXLYl#mOFbkxE8$k$c0M(!t><0TlJ2(tJ1pQzl>tzDC3?u_- z@(mh>-VbWQ6QBjW1&)HTi>W)94iw-6SA#524mN^n@DSJo_JRGN6MP7cgRvRR8IS<3 z03MJ6GC)2k0hM4As0KU1UeE?Q!6zVk3H1jakOneAE~o&TKn>UhUIK@~F%Y$sxdx^I zE4UhDf_$(RYyw-sPOuj=gIB;?;3zl&CS6C}ffHN}mVr`G1s()@Knpkwj)AC5#u}Io z6d+A1bQvf&-1i%FFZ2blAG`&QfPN5jJ#!Q!0UuZZ@<9c-2h@PaKr?6qhd>WF0VXbE zj)5fL1am1qCt&;yj8QNh1i(^|56Zztunp`2d%;WKE$|`e2eHeE z2RtAREC(SF2HU_c@HA)xe*t|U>f7W8lE5sm3>1J{!9CzXup2aj1K>k&5=>#Az5@6_ z2FL}a;0~}2JOUbkH0{tXa14x71R-21_EFa$OV;P zE7%G4fdk+OkS02Z{SeFm(#(bCf=X}?s0GrrKsyZk3FyRJoj=2%U&#Vr$pT-=0$<4j zU&#Vr$pT-=0{Y(g|5sU{IFy&Yrrc(|A~zJ0vcux_WphjO@)nnu^24sWdr{uZP^dUZ zXQkzFvn@l7;AQ8o%`Pb%N@r2t%4^r;m9Af!9a@t&r$STw!CP38S9DF@dYyrLcBr^4 z4~AG%mRC9y`>MQhm@A62OLH^Um*kNnuhW&67O%gquqd~99qzQ^>|DJ>GU@qwWo6kb z^JW!m8O<)pE?vN{&(9RAc*QO+G%Vejv$ad)#i6{s5@IebEG=Kd`*hTK$feZ{r=T3O z*OZp>zEws6zetojFIRH4SNCX?(B$eVn~BM|Y1w7v=Fj*_x6z8jYbN=;O-Tl6y#6K=ligsHUb^V)xrIDR zFZ0v#k{oTw;5(Z>P=?2 zW#Gkyw;Js(UB-ykf8t6qWO21x84*X0+Kf;ch16yeA#st7>C&1$a=eb{wc+zh&r_d7 z`W)2lb4!a?YYjm9L!6Y^vJTf}7nU3I3m5qo=JMv~B1Wk6T~Z=ldK}GNRGPQ4kk=PW zXNR)O%Cw$XQbdCr5$K8H;#GS1vQ(^dDu~8Au0>@b5*o@Vf|oK+t~WV3dD;p^*ql}A z#U*P>=JVd9%oE@8yw&O1r3^_jE;9$>;)3FJLnV{0#W|(Lq0p>s+0D|ua9vSeu9lV@ z^pZ21AIX*#qrrz2QdVS;m!T~#k(~5mZPpBiNDpP_46X}<+_d7NmDdq%C?(0!+K4b2 zd?VHze|kX|Wf!fK14o9}IYasAZdp~`-)LV#GLuWpG-(ulae^Xp!3CHgO{X*HagQ(m}sXecetE6O#7gVAP#ZoPI|U+M+Z29eO4WU#2xotIaXQB1*% z6?#$L>f*I|W&`Oia}+JgV=FAn(+0g^pPfBeKK3eYRO_i5<L-m@%P{Cw&%REVLYv#^U7uy6o&M4 zwZ`Me0kapZVXpFGwwC4~R}WvbHm`KB&F2-ZHCN1)QgVuL8!MJxZMQPYW=^=lHJdmlPoIR5Qrd8z zG?p_x?cw}Eo|&kgrcB7(_Tb2AG}N-A>=T5UTWstT*i(wvFgaP8a#lsOZAxgRY$&5P zi1@3@M~s}5+1k=BQ;@<4R9`}ddU6Vjeu(u<2 z0Q^SmP;;fgVWcc2Q+*)ma@CMqP7$QMkP%SKxrOtF;h0mjX0;wmP7CSMr|xjxV72s} zMVmn~thO!<1torNdNxw5Y)^eP)IEpX`lQk2A3cOQG_^2tl^o1Wa#Gl<%wCsv8Cs7m zU2+iUJFn?7<7h22ySRuWnqVQdm}!U7k}AxekxuX{*f06QJRi zMUo}e&xf)|L$1NGVfdO0C80w|ibhmi`Fcai71PKoe}2k5t$ibTTD44uE=xxWqB_S+ zRd*Q$61vMQfF|t^YiS$|(~M$WW|8eUyC5%z&0b#>G`D`LmBP^M>`-WUktIi-c?U&m zF$;;MXmC8pJxV_l%apTA(~8&SmCjm|pRd(-kTd97Qc^O)Kcg7=LGz!Pdoz!}>-ozL z)yIG~IamcpE+?zY3RkZjJc3`v*KA}><&5BK54l4sgC(3C*eY+$Te#w8eQRWy&0}E9 z(jKjs@~EEW!qSz7yk~OeR2XH@!?4k0%X1a-g*I2DlGle!4h&tuEY(MN*# zA4xo;SntXC{OYsLmYRSJd8E;`EK)AgDg}kd8a!eQ=$w&l4cF{lvuR~q*}H}mA_ua; zq5m0>nxs2A*Jd^N=0Q{IggLBkg?Vy-k#KbM#+ON4(a+6w(lIh=3K47e$IYYTG_Axn&!Fh=!hBmG8> zSIL_l*`lnl@_@;HStzwCdT$bHXducGNtfOj(lu`;C=zaKu5KbLLN%s>tSJ+#&hoQ_}&aTZe?T6u`4 zX}!wj(I~PeLtMRShr(;sGcy}ZIU*EaAB$)wZA6mV3MQq#tO&vy^Vis4XnW2(WfaR$ zA@kj_AlWmd%h6L@RHRp&C?j=ah8|SY z5R9S|)$)(j1WIidV$@=^+o7SIW~7GJaI@8y>%;66dg3KTbd_9j29<{TQXysCjAB_u zQ|gs9FV1JxEnZWaW9|VX^t0>&5m5}+aQ&q8pIOcVv|>$po~~sh+?=({McLcZE`Mxj z*p3vb(abB02yJLP=983Mu+Ulz={QH%KEq8ZTr0z(e_Rz=8%-Z+mVQ{(r7mE2$U#lD z)=O!5Y*4dN+7{+yhayJ$ydqfI_Vanqt3t&qvQf^4D1|JI?v`a5av7?9!%xcPGkJAS z8+}@AeRYt$p*W^ORZkDKxEV!`SbYaVQ&7s-FtzmXmllWCtmZ3j`I`QR38CcyU!NZO zxj=@~-CAx^>zBhWKXm3BF%}4)k+-@;ZsJ-i;T{@Vvc{%+=rpFEPNkMv&r%CBLMyEa zvHxRj|4P|KDSSdu+x}$wTDNO;H%qB;%uz2xjJOe)yCxKpwTe8Ujxwr=sbwUqW3(rS zgH_rcRS7y)lZW7`pN`D@jh#tv&OsfBxnD)7M#y1yy3u+v*~l>(anm#GMkj*Lmc-qH zc9e`WlzlS*(UVdnE*d0>zrJ26Ao)eG_LEN{6;qOHjH--itCyv=!ADC?oDk z2|akinO&TLG&`TOlDsw5YF(_??5Z_|npShR;g+9y%r4S*f!W1qGzV8YJ=W05_xXKK zzrT#kcV3yMS-5J6rcoL!g|YnUi-Nr8nVq(n5F_iiI6FUYW@%~m`to1XH?h0QW4&>!H^isVqw+QRgAxpdlsl{};Sh(oC`DFkjNv|#EpMh4pdHos zwV_zjPoASbA4A(shvgu{YO{P87x`Iw4C85%-RHRaZOP|yTBpnWLuFc&S0XRJhNVbi z>xRdqz7eO}q1d$TsC@R|VJXVCmK|blokJ-Yx}IU72L}$P%0lhZxwyzsPjT!iE658C zb-t{)Ccv7@j?{v!WKAyA_0rNMhjNLwK9`M%y*QPU8Qe@P3J@SZi;!h3wN;YI(KRO+j0{FhrG z*7%mMGDVr8_>>GKq=c2N%5J4q=}@|rJ|)T$XPIV6v7}ovESZ+&mMlxIrN9!hR9Nn^ z)L1^Sd~ErLWr8){nqXC}$<`EWsx{4;Zq2Y}T9;e1tQFQDS!=CNSf94OV131U!1|W; zFV+vOpIA>=$J!>^Cfm-pU2MC|X0>^2vusz}7TK2BR@iQ~mD+B#-C?`OcE9aG+atEe zY){ypw!L6`#dg5wFWKX8&M$cN$y`Gmn?|POT87|?|Zj<_j;f6{>OWv?{43# zzQ6ir`ZxF=@VEL8_&fZ64-5pp7OV{ZA^3Li)1XM?H{|JvyOjr&H!SbcPXDn)TZ`U)`#HsGjG(!u^KZ<(cpC zdS`lX@_yI5#k<^><;(Zo>?|2_Uk z{QLax`uqH62et(s4>Sfkc7#y#{ZaqkH5j+=zrGV;(vu+dB>j-SRSYfY^4QW2>dPZ zkHEhJNZ`mn-v?Wy(tBJIYg* z*DMPi6Ff_OH~I4Y#qtALSwi~`>SEWkly|%PH|{^V|L*pCZt{HKz1-*UrT8*@H~4<( z+vhv!JI((!zr!E!U+urvFVO7u^1+)uipz4dtXnn)l$;|kd^$dDo zy6p;^lYXeOZL|H@)?jO~{mFKOQU95(-!_hMA7^j0zicmXY;bIH-0Rrpc!;*$dyu;Ym1sN=Zfq+`5Ow)j-%bmtXLr!(N3>s;Vm>b#NGFLJJRZg6gL-s{}v ze8{=Wxrg4^=X}YzpB_2vJmNg+JnlT{9PgUsn&O)3n(n&7<#YvHb6pEuOIJ_R}4XAUO zeM{9F)qJ%`U8`vlk+ti2DUFsfnuewitN!_o$p&nL`s7KY~>PdCHdy;#Kd#Zan zGr{Q&xaYbTxR<(bbmzN^7=;_$o80%hx49p3?{e>P?{)8UzvSM}j5+K+;y&s=&WIWB zndF(`nd+JDxq_J;@XYlr@GNC^=X;8n;Tt@gnC06%4|#TZ_IUPs_IY0N?DxFkIqW&& zIqEs?Iq4bio#dV3o$8(Ly~6AC2E22<3%pCcH+u8EMc%dE4c<-Od%fGd4|#Wa_pmPP z^SRD1!Fego6ERe>bsE{T;yBp+u+;eyVtkP z_mFRwZ;x*;qva*ve%~9u!@eWFqrT&eo$>xj{we;c{^|ZJ{7%NuT>k?9QpS0{zsSFq zm1mRxUjH`#L;hWi`n}Bem;C$vZ}<=UkNA)JkNZ#h#|I__rUa%2rU$MFI0J#e+`xjs z(!h;@{6JA)ZD2!SQ{Y}!hlc{Y0($~`1N#Cm1@;Ht2pkR^2^N#Z%3Q0n1#=0?Sg%jh1}N8yZ&$1WTOY9Z) zu)WG&%?e#>ud~-P&zkM6_I7)Rz0=-p@3r^Yg(KP#>xg$GI%YT&hw4anq&m_anT{++ zfuqDx;Rrjb9Mz5*N3EmIQSWGUG&@=y?T!vdr=#1^>*#X`XS6fc8ShMV&TuMD)tT%} zb*4KromtKT_OJ?P*jeSQcGfs+opsK7XQQ*(+3IX}cCbozJA0jdPT`7n#k%5MiLMzg zl~ps-mFuc-gh*b(y(!*QZ<;sVo9o@kj#%y8>aFqa@YZ^Fdh5Kqy-nUj-Y##qx5wM- zJ?8E6_Irgd$`|Le`+UA+R_0V+nlGL8In%e?7xHcKZS~docKB-9P3qWB>U|Bq7GIaI z$JgsS#=g?;6aFZFv_Hn5;P?4c*k#iE>HZ9VrhmCV%b)A7@Yncj{X6}2{@wn1ZRct7 zH~SCzkNNxkA`lgb4#Wgv195@)KtezXqz5wDjj{r{fr3CNP!cE)R0OI6_3TYef#yI< zpf%7IXb&7@ukH>+2V;YA!T4Z8FflkSI3t)8RDvnN++ZkJ5-bl^AZLVw8-rEBEx{eZ zreI63HP{wx4;~D51P=u}gI&QsxgS^ayJ?VkB~h7%gqNf!id|8W^pcfKr2<)Rqf(`8 zQL2&oYLp#HtI8J{;}mT%QvmJS@&E0 zwiMfUZFkweXZybG2eu#Cw%dMUd)W4@>z2CdiII&9}VtPYoBwjl-^J%@e&5>Jk&z*FLR(DS&b!Bglh^FHhC@V@6= ziv(4S&8N1V~a$I!syY7$>qy1^+ zW#ul*1D5wJ|FoQLU2OdhXO-s}l|9z;Z5P=tw^*JM^VA=yKUe>tzN5bCzSZ-LXA-B6_k5H6 zi~QI5^QdJf`}&1}Zv|2V*Rq1#9=Jd7V|MPB0|$_72Le;srGvr6!EB`39|oUdRX89| zA_$#~sWE(8mmOH{zl)U{nEiJtD=lT5&)TgYSpQ@7GE!gQbT!%TvH#k>AKCvB$7K#T zJKT*(nU5n`9(H`-_`BmXN5A8c>oL!Zp0VDbccu41@8d{4-QF{N7mTvPX8Ce`1+23r zoLDM+mA}SZ{lpw>ThS2K16$V`+Hce z`?S?suGMm-o)(zFYHbhr0?D*=S|EdUTdvx2&8}cYr>yZea75qB#lMbQUbk|M1LhK*C{_xR_qGIy{b9j`fba z9a|g^IDX=I#PLhVlSnHsI$oxq-*mj|=%S}T<-~TH^9M4ib*Aeaq?Suu z-{d6Wb_HE2u7$28u4S$~*WKz5)mrrca{pWEC#rBqA!!WB89sM1Yg4K_&7JPf;3T-* zoyAI3;0_IwK6bbp+>OW`>7ESaishaxPcCakSd%PvvsyHInmo;(7Ei0E4f*2WC=y1$ zM|h*W(cTzutT)aZ?@jO~dZ!_4WO)m`A#aJdoYQ}$H;lwlg`CmiZS%H!53>Fo@^%{1 zMzn8+PeIC1hs}b~C5(2Yi%8i*AI)~;3SFuw@Q1YVTfqpfVZ=6TBeqQ&vmM%~6@f&? zXp%NcRc)N6Fj5PQaap5{%$?fUtY=jAFc$l?(HIqs4#sGbg*})NTpr9qq9}-vDQXyz z&7YGd`sErDJ4UoY5pttB(EfbSR>N-9YJ1mq)OH#t+RIsWu0;x8XWwLhkkR_Iy~qA<`((%W z*)861oXH5h%sJCpul~XNruUD&fA~K2{mb_s-x&XC{t5mw{b&2n^`Gazz<-hdQvWyo z-||~Hal8F~v=ejuH!xp&0~3Om1k;#%HNj_*jYQ%Y?YC(rAP+5JKJ8b2VtJTd>lc<^ zQs$>DzqLGTdEW9n%gfBH*N|u4M51|*dg%JD|5$2lO|~hV8t%3K-2R+haV&H!c3kJU z!EqCMoRyAMj$%idW1ZtR$L(l!?sjZ;+{eE6faAxGpE`cVJX4)zu63^4T(`UKblr{C z<3869T@Sc^?E0zeXXvUPcm2xsr0X}XXI#&rwfeowr|xjS!pPo$Jp6ahY2FFmGrebf z&-I??y})~!_hv@mU%e+dYmW7e_f6!y8Sh)@Yx2G5d)xOex{<%JlmFfKPo&r&66zcN z`GNZazX_bpIc{a}j-XJ+h)VVap% z>q%=0Qrm0xIL887=XUfGW1Zuj6VXjfMmupnd*H>aE|;OBu%e~#pr@FHrs8UJ6^oqN z?2Zk{WS!0ySF5WHZOcJdhwG55lao!itH;&rI)+xS-zC&2HG1%*GfQ2jma6xt-*$hO z^G6b={ku6^$QeDun>5NvBEy^MUCvz39h~h|$U*&svj5O-GfmrX6m7@xX?u=-BG~SK zn)CAuoSZ!r^f+Bg0NTcmjlmbq< z3y?+MLJEnoZn0Kdx3Z4!U}xTGt+Vd7)>|8_jU%My4(lN_M#rq^KJ7Q!SJ?CIH`|Ns zrS`Sg!&2rt~Dj&7w5(dwRifZSa z=u?x`6g5>{uHK1c@`-vTYx8V(j=Rs@&$%wj6YYud#Cqa9@ty=udDBKY=cReB^Q>as z{QzysCEi)yX3k{a@Xhiq^F7T8>kR)i*1GTcpZCAz|A#+?6VaakQVUK-FL6HYs035x z+LS&&1?1;WYk-kr>`RCeC+rK``^E4u`$lmoD-a9I?r~V>pahS0XyNP&Tl%u z#ct?ux}ARKLgz|n?ue80Mzsq0x|$Ppjk<%~ZKqnN?pEtLUpJ~-JQsOA-aNF(=lRy5 z@j2Unp?@WM6p=MXs!K!#C$W0u(j&@bR?#h%$1T6H9IzajQJZ*kJG3Vp;!&cCCp z{ml7q=YVsZ>vY!{uCv(HzvgO0TYFT!lAXEJtqz{=(>#&8@oQ+r2D}MA3p%iCID1$4 z?)N=F?yr)!jh$-=`ly<~&yi*S%4``MJTrJf@XDZ{b!tg)9eSn*g7xT?dV>S#l*R}j z^X3BOV$QMKl%Jt5YT>rx9mQ^)&%HyQb+z?g>x1^Q97{R>JnOg;-St-2Q>>-up@F;x z{o^{$7LTfrseffW52zE}7q~BTm%7)vf8hR``=9OsPG#qKE?^{E(Nyu#3DN+YT61F=^+&@MW!Z0lpsHZksYehRn&SL zy+83i%(>+kzUMVbcQk1r0onG8R+}OHgOn7i{6D1?KlLY}-|GpShL&I{J9~Msj=iph z-L8jrJBB`hUA%gXXrQZw5~V~VVTcy{{}{?v!x; z{={~i8<&&Zxr|5qJc)akDV)craw4B@zs!Dx-D-ETdso?i;@IhU#_>@*wLU97fR+s|!(wjFVt#m=$P8H48Q zm}?tn+hb~<+OJ8JDQJh!_MGcEkAA(#bE#*g=a-&ed!F+A*7L0AdC!FrI;9MBx#7T1 zIp<%9&gEB}b#?jt16`j|KSng8&pca6p|u*6Kd}>DzzMyS`>?HOKiVu^+=j)XlT^`s zBoEVlgjm@>zpl4&);y+ZK!h#I7Hx~M#oFS~gQVKhZ5f<7mq%z1!ql|Rwi~TTgRKz> zq?wz6R!-M_Xf>nIYsPTqj6=7XfOb>Sw3^G2sB+nRL+Cck(Qa00TFnM~qrC|&K?}Og zHnf{v_9#aTTFp50nh9t&r=i)ml(QIx+w^^gtP8d1F6&ttn%E&*m;;|bVf1SHOeyEdb<}|-Q))4D zIbZ+RPS-CDo~Vy;D>Z@Ba}wv~(X^V8=Z~;|qj84b?SFwAh7SM7{#ee)iJU!#P9ACK zHsvXKq;|715Y|r1TeS1?@N%Fa>Nlr~$t?I0_Qlp6QgpRn&mKH6u0fm`cW&H_H0q<8CB_yO9EC zxppfeSC1XsjO;`f+0E@p1NS3MXd7C%BWdH7)gBD^_s4tY1j(W!RXSY zj$_Cj{iEtG%oRo*c4s0_I$3BlHhJ&i&ZNbDFuGXyMvEr-M7`SCPcN&#Ze< z%G~W^L=VJkS!B81a)I^xJmYcD`jNHFevac3M#N0U!A*`I(d!*(p);L%^x3b`^q%I5 zb6w8rem%Fyw{dgz9P9Yo+!*({CaLGBIowBmN4*cp`B&UUy{x{ic5)AVhWmVOo-F8q zzK!l@jr(qHn|887w~e@I>T#zabry40eg^66BhLwsi`xH%yP)GppJ#CsJHzKk0$u7` zj~?=IYS`%;@LlO&=AVMj?|bO@U*P2SPT;e^H+VWAjr*0Kv8qtXPF)7MSg~>@zCn48 zJCY5SKJM=woP*2R+26BfA&V=VBo5nu#_8dF=L$4p&!E?y>RLhl&f*MJqCUr++GlE# zdk(i|KXU)k-Q&K@bG_%s+&c^JMLgkA?tQ>}fO5|B<@mPyo<#2%jm~$C|EGaeq+ltF zycra|V}yLQ?^0zww>JM!>d{fWW4Vl{ZL)b*&s zL!LW4uW_^eb?(uA>ix_+7fr#peZTU34Snf7{wL9cjt#8mKKLLju$x+s74pT9%hB$% zE8{HJv5H;9DRe)5d_K1{>sUWtM&JDndkXrR-`mGKE=LQJ=ePr1ai?P?PZqTDB*E#L zj;|PL@GQ6Yuf= z&c7+}{Xi^tXi88G`hv;G#;NpcI=Zh+WaOKJrQD#^jk<$~#Ia%{<@mWW)?&4MhZVaN zy~aJ)o8g-b6P3H>b$+?Q=B!RkQtfXs(X&R8Oj7KGM^7(E2>$c+vT~ z^HSG$IT60eeZ~ZCTwdYyd;#P0Pv~#rI1!cmevZcGI<$Uw`6qLmSMI^-?P7K|Bqvhvyv9SpZlu^(U?5qd<)6yxa@tk zkdynH>iO=AxaG;=o_3r2SMKH7s&OIb@$0;AdnfQ@LXPisbZTzy7&iKU=Ks0>an6NL z`hVkp#{ZoEMec$A;Qyolb^o9JZ}UviU;TgcZwmfLmM?j%yap0E%5RiEGABM%erb7; zd2t41{EJm^OLCX(r?$5_pJtiQe^ zQ-62;)AgC_->w1IIQ4Y(4D~Elg|De!S7)FDF5y{^Nvx5NA-%VHZu9=j8_$e(_`b`N zP=7}o7|ng%V(w&L@PEh?5T9^Ya)PHI#sEt8!qG-0Gs1}$6{v&TDza}yvqSr zttqNQUBdbPb@gZN=Xi$fQ};Zc0=dwaz@5XV{`Xl)e8C?Ce=pO{8Y?;=6Va~iP%7{OgnGa;*}DuacCUAd z?>p!Ur=TZ&kf%r<;l@usKlOxvum5SZ0#e$0g(pf5pf`Mrr%IM^|53)XB9Eb?d4iL= zuJIBjV?`zPO5hw>iQKduNvT<}qj7oC@-(gJvSwTF)HOU`@FXX-mw7Vh5YqGkG{AMN zTGP?71%g?cl( zneX$|(GK<3tjE9OwD6JoPxW8w)y$4!o+=8nTR-7$;#s10_q*;7-2ZmR@a%#;;>m^K znvHUvUD$z6z}%Y~hTS%FYFdHew+iOYoQk$__|3wW!KWFv@;pKVebfA3ybqi9|1fvn zfi<3g|33&4f*>}P5_{ceult;1uLdcxgV^CmZw&u%YEf6G@O+mkIbE%SM^*P~t|ecFJ-d z&1fvssYXtxc_ojgaOzitKl6t>3zC|hzC7V0(dx`#B3;TfDt6t2JnPY*cUP>j%%K`k zT`v$_q1sV+?kjTQ`u`_5*iyOiMzHNh!llK)BFBObYgBjD3m(HqGHMo7J2g@4G(q_) zHr>8($Rpv8m#Ayuh-1KzQ^M)X!v+U1*SzM@Uhc6IB^w-?f@)_UtZ+h(?V{v{VjHgGmZAL8z6ivA<5fKZtiZYX(BN{`X5*7ikD@QbcKdVvx8@u)RcfZCj4 zmbrpTAXa}L7e)NO<$wOY=D;eG~aO{mr3K7klRXe6Vl*84eHckiyw)ix z-(f)a)WXpkMtv01+GZGZ@kvF21)PCFPx?7!<(BnzR&eT_RV8~a)P~4 zfLG<|=c9AzI_b_b8C+%>zNfQDy^`3igQU(Ug!ybN^YM(gZrEq^F)2I`39&q1gTYXl zyZ<$tvr!^X`&Asg9Bw25(> zc%)P%K1G-4hBEQ>Ca$1N6uQJfl!@)wz`KFv^+BJQ6wQ14J{|+UC-?$y(7lA%UfdoY z1P?WglP{D_JSo1nFNMuKHO4O?Z>3slS?Zu~9FignvmI^YnKvSX@3PaklNyA+*00$` z=kN|5WEYJ}pn1H(NqQf|&|9h=)p*V0>&c;=&1gRX1JqUhS@l92KA36ig`+g{Xt1-t zb1ZL(CNggSDu52Ds8J7hnhUP9uu0F}v)pvRbe7Mx6sn<_=H;NFci5k`mU{4Xr}*8( zzTAMH?Fky_k8I`C&gxtk;d5$MSm3JsTg#c~&pKiqSy6Tk;=K%mo6L-At`%wk@lu5{ zD^x%!*cEF10G=XUNa-#(H$BWVrC(0za`wiMX@bnqDyF)m0 zi!w={)weUO1gEM14iRdcY5LBbpDi&XT2_~}F$(glwlelQpaU7zVz6*MnI`%;v%1=| z3oMsPv2>DC9L)^-Ilu1_eHOO+jHqQ+fnG%!jj+>WrFN?Tw|Z@!-!10dsbJE1;@e=Mp&%$i3pVBuP|n|BUNf3=fNd5x8_`hJLets8+|k?%Eb|-lBorizVMY$3 zi-=8u7s-q6+Yj$k6V8aBB-(Eah}5UnW=x3Pt^IISjI&O)&cYY9jQMaAzKS0>-A=IG zo?}A1jkDsJ)yjbE4qVV4ghT$1z$QHf5jqD%MG@z zaBT-|$JpY|fqcBMdBT+zx7%S!>#&cuLTA+zPsP{lK;PQu+n3nG?OWKTe`GTJ-G0q} z8zpxd^es7=3yZ;Ao6&OD0?BL6RM=hZuMS34I0-Ms0_MW+)jjF~ro-Q)lJzl4p-hf! z@EsrXBx_^E;2YX^KKOaFQ~w@ zR|)?_1C)U6oxPl2!fVWM&UR{o(rKcZLz?lec1QIxMK?<-fA`|)`9pUJe($-?N3Yj6 z0(0-6?|~{WgxNq$1`FSSyeEAU;^xGJbAbK3yeGMTv8-~IEjpclv zioYS0xBexvABhv~D)WOU>|Y%B_bzyT-&dUASZ0fL_Du59|Ft&_R8!`Xk1a!(hBhpq`WG7aQ7 z29;H5oIbs97JSdMmr*ST(>4Ic{s+`l+0p*gWfGps{Ckl*G$p0K*bPc1Q|EmcN4D>k zE8vRM5P5ORr;KJM)$$FA_XoV5q2HA+dn(Sd;B=a)JlF2%1PUp|6o*nxX{~ey4gMOR z&UzFoag+3Q<(~3L$*j$()uO)X2Rpxz)9wV5@*S<0L4eLR@5U0ZrSh}*r*aMtvAjt+v^|+OC*~i`vF&&Zdb2|cE=6pS z`>oeOS99C+HoM&RLvZKJvn_+2IF5SjjxC!#k6nj$$!V|8c`fuT!%(yAU~f;SX5&mQ z2P<6_cTG3&nYHR>&fhbrG>bS&vpxDt$J!LfEUCV};JD7rl8sYUV6b)2vNx2<>dCMV zGr@C&)8Yi0xwQCSD&aO81417q6c|I&X`*;0^Mj$b0>N4gGx1OB>aK9@8B|hb zQC`%o$p|pXX$D1C9C!$5=-uR!PV>52;V6+G$ z*{vp`+<&_g;S4N{(DBFN6pxdrr}Mt@WmT0L>b~$uLY43VnuLkzG&54wB$Q3y*s7X> zR;!y5oGRXtT(@vgIl>zg#XfgNdc54U?pjZ+7asq-Nt6sVrH(QfyqS0s>c7d{IK=G)2M~VGrXQDUS9JWgG{O@NQXd4P*xDaRb z9&Ul(ZGUnPys#C)4P6!PViKO`)1bA*)Y|x&C#&J=FP!%uF<*CbOn^iB4Md}ubR`5! zr(?)_YJuME4OGDm1((|{k&ofSXP-%39Wo#kQpj~f!X&TP=4 zJ#Ryv#R#b?JOUmWZMe;>_6XlbeiT7M57Y?kv7d1`eC0k^k*sh&jX)8F~_fy^+ z0P``Qo%Mz}2lG(?8tEsNXO=WD7%i=B@cDORLf>NDfz~4ud@Tk)aU8PtKKk>7I^<5a zZttM4NzCCzzK3H-M>;?o@&US#5YUT^fc|W>UrDvic>83s0%npH5H8hyzvD0{sFuYo zl-QFT^e;H(9<%ReML(?YF4j!qSWZdXmlRc6`^w3j5+|aOJbGF7;W%g9Kh^vte$U-e zet(QYW3|{p*2dv6xs*fN>3VlV3tafVuxt~JCyXYvz9&q1NK4s|zTtp16ONdt_HOW| ztC>BAk@dm#5dajug)*# zjBxrhEf$_PKU;I#*WhtenKbsJ)ws;8;iGm`d#VPsGSi(EnN9h3BGXCTKn2u;pOI#; z5&!f((4T7BdT67@q4EpSeNF1i31damb@O$LANyuS>4JZa2nXR=`_g{W9-wY#HV(l( z@+n*he|Jne=_~$PnatmsPMcj@SX&2YNFRN6_#!=SS-s_qbrV{MBA_CD$%L4R8@;e} z?C!#gm>1_$C)aGS({!2u{yKMUUR?!L4fl0*z#@jSUHR}^PsNus#&itD&I409Zjt`r zNzvx?s8#;9>;|jtiAw1=+XdTATS;7>xzvX0T*o**VK@1+jnz)!bh)i9$=`fg*H^zl zU&QbO-_bez6FG5ASn&)tH+^RM5(U^3^AO8=>mD|ZDr!kb1LtP(J9@ckeEH*Jr5W4f zLp<4~&_CAGl_Af;3Cb)|fiymD8VlIkFuu#FxH!T%)oyA3(&k1tSrWx$U0pL>e|F5p zaBhF=vfI zjdKiH0>3z)I17Phc4r>lCVWPUo6MX^kGm@XHeAe$A<6jvFy-yj;=A2nHdu8(nHAMt z`#I14x7zQ(oR3R))8E>BptY^p!6x!OozR`e`R^tZZ$$o6XQ_7)yqQSuh>~dNLtF=W z@lki+TU*Nw^B8WSCjPo z+I-&!vQY_LRBzw>!xDLgj`04Shc$6SvHtF?RB*Cfj;U`|phmw+>qzZ>^_5IkHPWcs zgYS;AO+v%BLgwY%v;A!ot{0W5u(iE2x7}p>GW$CFF;24woJ-HZZS$yw)uLdwF7~wc z@KFQR;WG8+5J@)zQL9L6_?-Ya%7=^xvBLoiJt9jkQrr3*Tr69*a=pE_Us6(u0-; z=UEY)ku^#7sISp4N8^Wliqfy6rK{yL(p)a0Q;wDH7pJu{ zoAqq#JZAirO!(rvZ38~v#nuaj@nkfz(Wr=phFFt=`}w6#DY=3;Fp*dCwKMv)ekm+I zjb$y<&f7f=iBC#H5)bvuv#}ld0aI{|E#-bcm`t4agMR;B-fo;R^Tk!icE9~u#PdY+*Gn_^WiX3LAW|=yQ9DjMN_wjY5od#WENd{or$!)CSY43 zx@o#OxI`mJRyi$|3D0#Im}^Rss8X5CikbRd=nOo#1)GAYE-`H2-haf+U(MKsi6=2^l|TGQ zS6QiS!Lt~q&5!SCC_l$BxQ|Zk;Uo19w6P1|VfPrznrx_^Mw|Cr)>yNF>R9ajkAvMb z1^HuzQj2Y7BZ(}(8@=%ZJ4~f5njvxjw;v2GBu6;fIMdh@?C7GUvqLk{O~l!0KGK%f z<|CEhQ`3)*za8_Odz}mTbhnd+b4I#9Uhi{mLRy@P_ail&r4xFRID}=aG8eDm20ZRh zlmdJsjkJ;IKdx|p`RI-4Kbq?MlF1Sp&*BMvkKk-R4AUEge>W~KbIh43B%-?|4g`qOr zgHAF=dZ}J|>Rvmk{x@%?$5t;G$1=7DwoV|>Bbmrn zAyK1%z8DE(R(9dt_-}uO?am1IHrbGscjzuYQ-2ii)o`Zgu`~dw7oXRaRNZI)o1fYJ zL~d;#m@X4|&SlR1Vz}P>aZ>LcLwr(G(Yb|@L)48YH~>FrDO3d=nb3ydA8rdr zm&4K;4TJ}oej{PvrgJwfMPZT2I(KJY4ejw9%3gF`+8s8FvFz#Hco516h2w( z=n-Uk9KnNo7O%&B^7=f;?kJA8AurEEO{o}c_r~;@l~Q4Q0nE4qs`2S)p#O4|N8>!6 zDf$e$laj9HB(+44XU8ub$yvw#k&di{Ku)_DMd1wS%_g!CrQZhh+*h;@a7dJ9Z)r~2 zMIWZzsqAShd49rE@$X-J3%8(1Ww>CDw~#J$6BlkyLkTujGm5YphWdua;4d9XcNt{( zn(cKOs)~hpF*f1t`~g*JwBelL61gu=3~7xS(S_wlqgv8f&S(eQuZ5l{5VuAb<1Et> z&W(Lw_hKf#&t&m55g&F-DoWFX(VwuMwwhpsZrk*D7I&eXsi`(X7ucJ;(E+H6zIKdo zROen8=p2fsVieAcNzQMb-@%d3b1rf|6pn!yH%&Xv;4b9;y~N1AVqYFj{@-M@Ml;C( zoDZwBoE*UQY|&fscJCn#@GxqM<0Jx}!k2uWTjm;x33p+B{vsRj7k#+lg+XXD3L1-} zc&jOs`1&O9td8ZJ3^Q(FUnm>zOr2tyjyq=|USW}?SCDOY5IM2maQdwzUm})iO0X3r zQA{X_QV`xgzfVlj^DmgYD9(e6axQx+J<0ETe)h8V=Y5%Gor&ITK8cshVXhB=+y2J8 zbI$q~ITbQ| zhAL+CDr!@v^Z}&e{e&vi4PS*fX-huu=tmER9q-FDKiUx*ud)qCZL`<$GhDeFS$GBU zj=m2+J`$W|R(uNEF?hj~GQ+j7tAwkJt1?Qbwyv(O5xl2@BfJaF;imEAJ&n`4_d@ac zb9|PuhJ@Sq#a#PHoOK#g*G@Ti2^7^c-rpUUebSFOz?5V;hs zNFJ$aG?=@<>g9tq7{PY9kWAI~Lo7Aer_&3Dw${oUZen`I5QVfuV3TH8nNCtc9Im%@ZO}%smF1B z3iobJZryHj&mT$l+QbjiO?k_tq^j&{|3sC2@m2Oh(i>mgh(07SGyoI(7B!)UyU>Aq zbtKr7P)}d7cw39Y+SkNW(kW36+en!L`x%irI5+yPWEzsdl|dlUK_=U@JfwD8z>T9k0i-ni%pR98i%*~khrYl9{WUX z!}}u~BVphM`*4kwMgyqBC#a(Oo80zyLJBJKJ2_ zisbx=SB`&gsf?P;);^yNBfZ{3pM?!0FG^~`SI@!8yHuZFW~`J(;U^S(Va#@SnB_E5 z;a~7QocHgq)VoA}_-ileV)W*#P3yr0w!%5@;jBDNPWW*W{!Vdfo+mB*8vc~K_)Y)f z3{7j!V9rEtcn*@o^OGH31hr~um_8jRs|`n9W$@P8Q;3p z&tSrNd8(X{1mCtjg_OUf&KkEwdBX2EMZKAQ-$Uxwdg-v)iOYPy>o7^)$I0?OMe5Rd z_MdC$zVDLh{g=2cz--cMF1q0mS28GZ{+rxNe)7GGkXRY##4(Y%>r^U(z}6<~yFR#9 zGxEOMkof&?&i-k&8MK+m2G2n{cz%)xi;xgrnv8HA-T=WvR3<6Bb~0aM2&}{;ZmDqj zJ{}=|BQZxV^e&IJPo?H1xzq7|R4*e*>sY7zo~+|&Zm%owaF77~qs1GCeV6Ua7wG_MeUAvWSyAF*IOK5P(1y7+vuW=dQ zfg7A|Z4#B5Gl*3X8rgp2=FMYMIxc++ zk9CFl4Ygzvv|?xKExSk-k#+sOey4QVoWiSeMc)JLX$G8`WXlQIUEHd zZ@4H}bvt7(X5AGaFb7EzTolh>-2!Fu!WUhcSs)0-K`_(i*B~(8apw#5+9r^gvrL~4 z$uTHS%0d&848D_1AzLj6=m`;c%3qfBINgeI!`pGN)U~#@b|lG9q{GaRtst9GwjH%z zuwIkC=I1#1b8vqb$Ib6zr|XCdr7QdM78K0s$xbZ+KiNYaMYcdVo}&uz?Y$k}<9Vu1 zZtO5pZ`h~9;`V7TnDl`lRr^qMd4d@?rx9s^b~W1eYr5@Z)}JDk@uofvX?Y*v6Q5xi zV5|jCotw$$g!zbNw=FXojUOECU87Kp?i1hT+VoOCa+vQe2Yk;Y?KrT*O=RVI@aaz{ z>#-V)t zCyr`|(!X>WNBd8P-wnNuaY=Zk*lx9G{;a6}s`g2Xn0ptV^sbNH*DkUum1QBZ;G**?Qyn8o*RG zpG?2y@C578D{iHwWe)i!yBym|=J3Pmr-_aGPJMWf){yMegpAPDXoSY$+o{gK9A@z0 zZh2ywOCs+bb1}N3X5hPz0mCbdE=`NVYYUTJq&){`-gNd0yJH2J^X2$fGl)7NO%-y( z6sD2S;GXw0X~d#f5eeK5<6$P*%Op)@w-mLMvFK4n&m{vP3MT%pH5V%UeBg3koStXZ z!Ju9muM8SL{yweJLu=IS*F7YebU#`he>`A)%@ZxNNCL!=ub4qT!@ZR(+KQ-dvY>a`ZurS?(hzFA z4bs{MW$G<%(MEU=N>x@Rw~*5JNyI+i)kIqo^mJ3ppzrlG4D z$ezYOgM6Mw;`S@3>w*r^kG$JyhHZwM_%N&CYg@sM+yp&cc{DUDX@o*m6qG??RG!KN zcCjl;Q5*uh@!)x~akV$>GTk)wK%w3k{ACTzonN%QH+ke-XW=CsU1%^L|v>VY?Z0C_f#NwZjC%FBk+oyG!h@^MS4L5?$g+L|F5G-$*^a%BT2*T+MW3YUaf4R1}=L9NI|-IT3ZpiD*ntL`QmEzQjv1jkjVO z+xIhk$fe||=Wh#=%}1lz!RO%Z*oY_ZD9Wx&;95`cJ!NI%E^4np*GfgO#l~nEyOX>z z#lC@5!o%Q<7wv9pcC`Q+Caqctj-@_#S0~hPA*k;slUcQdPk)`dP5qG`qYLUr#|Ec^ z(_swX;S@4lXSwFWe&gevm?1tptOnD03vEYjPc*ILVYfGvi?=U674P*_euHT|FHCo5 zIF&H?lgG>4{o0{`n#fxm#cp;#KL0m4*H)1P zfaW9-^pp*9tJ&9%ll}a+H6QuFs#N9%!eb1V?uYHL%rUlf_RQouR{@0_B3q|sB8*T)aIvaN)#Cm3d1 zxaj_GJaoyotk47*raNU{)UWyu?~sQ7(*2w?*Ypp=d06vnhFd6>9@5YGoSPzpF_SSX z+e~gabfLc~PKQc)W;hc)DlZj$b&d6LJBX|mq0Q-H?16V~68V=4j7!*k_R!6ESSBTF z66LJ;BuY$9h+_o&OX(|b!};T!t`>6@a}63>+6+aR`Wb z!`kDv9*^I89qx)pyj}T7z;x2+RomWzbo|cbfRCbYb-w)v`%ifMZb~JoCn{>KYE>KH z`fsK7;?`Th#IcWgPc(w$k_{kMazt8?WB9dW40rKj((GPl7v7)?H6My;1DOx4@$e6o z8U>*%U4v@uN9Qr#jyui=WPs!+ji@zK%XHT|rrQ&)v!X>QCW9t``z;N5!L@0@7>r(F zKDX5YHty@(?PW+K3FHPEiXvnuS&esTlqyM%uOA#&PnxBs=;q?9IfP~`6I-=I-6U4_D=Yuwu9Xq zXc|Kc&=iy;QAv`$1;*wnRTgEF<$DLnEZ(3L+|-jv0}>9leK`9s;_9!#j6c*e91LIw zy=4cPvhzwsbbnevzap_hZ2Y0|e*W!=vUO9#^mEwq+ltsqqlU8CD&u$S!mcDvd@&2( zB~v#8Po&FUi}Su8&!S+SLhXx~xb~1g_<-%(4PAeGx$_BTX&p)a2kGJcmBy9ZJc}>X zoOqr;Bh7OeyXI|24d)1QW%IHxcVGfO>iS)>^O{&@Ca$Z$obLN1y0g0I*hOeZr zHesIU9@OVMNW*=O7JN5%RXV2m_UuoelbQAqj$yi5fVR4fJi|l8ovFzvGZ}AcbtsVr z>K2h0e^y^zCX@~br`bqmR9a&`dTRnmhDyU6P>V*VL1;gh;o>cUw|xMZr$|h!h5B!i z<+7zM+7qj-26x{me*c?nyA2)l$b~%5@AklvhIGw*WadhJm{&&mJ5_=OFAu99p+814 zP$jfUO_@2$-~icdY6lKBiQVRRvnL6a11w|sH@5MwhENq6(QFlh*s4}WSjj#pIkPwK?9wiaZbzuB|Jcv%X6}1 zE8s}q3kF9589Q=DnN>Rt%~DR(gB6%Yzu?}S&J_ARdwx;8E6>2(eYi==lZxGy?8E6a zY?Xs6D}qCMt=W$xzj>Ck^ia=d)A$~rTeNJieTL3a0i~)BA!ott()(sFw^ zzT$~WLvH$2aE8kC`0#U7%qaB~wMb}qsAM+efx`|m)Mwg@FdjGl3P<<7ITxE^Wvd6f6O`;I4+oM^w=pKUVI zX+%TPnnnvvP)3E!8gZr7gZ=kA)NL{LS|k+b0h`h}D)VHBp4_z{ zvHP8C;DC3#G{G5VAC?zb>aVz4{y@iaiOnOs;bR*ARW%zk& z(7xQA({eOw{zae$n@xvcQcsar4fF&Wp&;=t4^CUzWNkMWfk*+kx!$=lLCvPG%KZLdET79G0W`&gQZW zzpxi4%{YkjHy_;wJstf(LKlFC(Sc6Xec`8;oc8%ZbLXgqw;B8g1Cs-&?8 zkcr=pM3X*XPs2drMIzrq)R5t1%k3l8EDDc_*aGj%EC)~egoQ$~Eb2&=ekhSE70Bk* zjom8*+-WQ-NWsL5{GILe2_In_6PbHAI15olRtMu`c!$rdKB1T7>MGCrET(hsy)0M_$DZFIO%;PPs!8iMoH#isld?U2)IY~uV z__ezqdSaMEIma~oo?c*rK6Fqk^iPY{DS!EUcEVjFdZw(~QNL zil(z`7eEnO9vs?9K2&4U$h&YF_Gh!1O6S-D+ZwR?2-{)4t@Act@b^#Hf}5g!&Fd(E zkF6z2wnaRvyHQ#D!5Z_K$7Ym#S_Nf^R=BZl>bf!~cOZ3ffoUU?&?8e(npj)FfvjND zA3)d1I_A*3mP(w(gQd6gNA~h8_Hs0abOmMB!&Fx%hq)1We@nQ)-YEXR0cDzo+kA<0 z18MO4;04d{FT2Z`ScjHBvo;SbbV>9$7Fg&e@|zl#B)1|0MYR{Kj*>#-O$S{M(7w$~ z9_}!JcW~O&!Lhv`y_tq?u{z-O^DQo^(e21y_Q>wf>0Ox5;E{8uOXKA(`TK6Lda=qp z?N@Bx%}8L%kAuR>gw}yA!3z}UGycYL#`-XPMaYxuN;Bsme8A&5Tc=wV!1RT~s~xfI zh4uQCJb+7hY3`AMl7XhT+~9%DWZpx6dCrJ5>+mFQN73|}#*vwR(vKWf@VE|V8u`=N zP|Vam?lQ}?41JqUdWRb0q3eh%Vwkc3wYil}&EY(e5xQRbF?uWe%x{JsMt|JtLrryL zMz12|$X!X#A{CL_DUh+i*xzj`Fu4bPpqXuPii``42*M))N+z%*=wW8MqP z9G3!plI`SDd=G`YW(L2Xjs~Y71c8)Q8!duwyb35|$O%`#y){)vA zPWFR3B$N(tOlI4U;HJ2O6H)K125;%EDa+4w9i}G>Nh(iqTpD1Vy7R=%Lsc1WI>rn? z2xn6dhbG8f)K8%2Fp+IG9KP`mQ>q)edhKz3_6Jv*&hPL8Z7;`3J~)R)EvqgMc?)_r zFFQT!RZ?wa9Ykx1(3!55ih=_)xST}c@h5JDN1SXP`W!gheD&q@b};of(czft&$rx{~bV zOl08ulGEW2Q<}qGgtRfyA=C=grw7<$UpUXNP+yECi+-9q6MgYQbvfB1LhB@28xE^S zanePrf569Gp~>ei_`Gl@XK-W!7a9OQIS~~|82Ds_Y$K0GTcJro-)V{O9`7XE$NR|s z@gblhVa{-73eh@#Q1*^T$>wq4H$D*8g%Ip6JqcR8Rlk5vn9xFgiV~)tNm$`ru8sXNR#1636Tp!eT4L;D@mJ3#q5LJ!d z#yTXvHl)F*1t>*(TW4|sME_k}ZqzMqk7t~dSxF7_wU>fXcG&&wZD}7JK*sARIAwvS ztwGIw07U7UT8PY&HcU!;;mt>h^Kpo~rXaIJ3vTamzeuW0=Xx|hp>wSUi^ zUxf2;555gET-BH8h3B)gtTUH{4G(8$tjBjc#gKt;mP_0#Ay# zzh-f7uBGqf2iTHRBzoQkTk#^9Fu>W7PkcDD(02I=$9=vr@01BwmV{1262EDHOsV=% zuSVo69j@eBC%S9=nAI;Nz_aPOA&VMw9zE-*oM z{#OZlcbDR;-G%z)FKu>ww0eCeI=}lFZW(<{<8c`zY`wk$##zyP$;W*xR4Mf38j{S@6~ zqPshXnqSqEVknpm(Qq-06J@cwgT&bjWX`%fyqNOJpzG2*YB?J6^!CPGH<{UMnPU~H z#fO;suCbA3CQ~yfNyTQK-aveqi)EYgaXQUz!fObPqmfp{N@%v)(hoC-Y5f-Z1b2U|}(Drn?k@!v@KLpkclw6Jr<6`5gIe@ktfbvyGxh=t<4)hqzF7!0SX=nmesskg;&~7nz3)hNEXl2y z0S#ym(On+nuG!8Rl0&J%8Pbb0WD~sTaW;)|v@BI&##p62N#a-&)Y4y)@w}e&gh%>x z=woxSjm5oBHIsDTbRt)93Om{Y-mVB#gcoqK-zTL!n{+-YxCtsUN&AzW6GVd70(4w^ z!HnHuCttd|UwYZSq@S%M-`>*?(^)Dla>sPE2*TUUh9)eztBRS`;}lDsyM z_Ge)}is`iMYxO|(1;#Oo`F1(Ebw_az-_;e+7nKN;$U_^a|5m>NZX~WX>II1-g?VGD zkp2*-aT#TpWLRU^WcV3;K)f9qG%8j!C?hxpe@5k1fIR)SrV;SEhdH?lqLJ!mo`Rw@ zhD7EP=tX;@X5P#*_n3TqaRZ31Fh7{E0KA=n^g*2zQIfgLq_pVa+3- z5y7IjMR)zRZH#R`4UPNIb;Qt8`)+fT3S!$9C2(Jf)C-jUzH9<>d(Zs5H|Kqb9c?K( z$@g=lY9m)N7moTbP>C8jAC*_N2#bC;3I0>B!TQ-`S9Kjyc@V7nuIFs1LW{(uzsNkL*L!Nlj*= z?UI4I@-Hh9N5WObu^HjaM`AWQlf>2aU!1>*y273cqV;Tkfpq+t-H{A(nsoJH=~a| zD4WG&-qL#Z&)ZEFzDNFj2Go7IU+MOGfe81f$1%>2IG)beX<(Uiz=#&ZOs_^&u@PQ% zXS}BGs8CoKPod#I&;0QmC2CGn0b083oV*S3A`X%H_&=C_B1_}8=^nUy7IQ9qPvyw; zXh2eaD;i1%NaSKKJ*Ai6{mYXI(bUqH*?kTwJJIfV30z(@j+a2Eptn|sm#&X;wV(7j z?IHz6@SO6E=P0K87c`q>R*Rrv zFRfO?h1QY#S=`Rw$@}>@xV4G&l&Qx%*o!9&(Lf1~eE51KL1H6JYYhB!}r zJTw>i!wW2;5%}v|92d7~=yGV=q9a`n7xPfthLn*$c+6rziv^$J38Ui8^HC61B~G2M zz+PKkHR<`mu)N;LQg_+C)PHUU8~O>&wVRsgs?uGq7%;dDk@Q<@g+Zg5*?<2qCo59z%GMy=cZSvk4}Viv59Lc4@;+*kr_|8A%Mwhw`dX4a?&0I93O_I%ZXhq8tRL^6 zrlN<&!sm5bS4dyL&=nuaNw|#$>=?&62XC8ZqmsF0o@yz|1ofBwsM-?;PfOH_8h;PD zM-?QaW0vv^H_R$sHQIrDGb`^jbTEEK9=z3Z(sC2@at&vOCdfl({(edG*J@a?XzgXb ziL8da_~mzS>leWrl3!}yM#z???KEVaqMb?PcrGV-BpSttha(S;GQFcadBjo+6zm~= zK299nopHfkBk8y%v&~7}0=*NL)+U3~xQX{66K;lCI2pb`YojH1{-mV@bHy^)+OlAV zBiSs9(XsQuz8b$xU*|@2H4mJcA)GgSE;iY(Jx9Mt-^H|rCI9wvaPkmhXEYsWe}bN;3nmOI7l< zqtuD0*4&($Fc0a2>Z$b7u0pSNoNSoS;aZ*>R+~CIXA5^2JFbW1k?JT7QO9gzz7r{N zE|R}SX=lSV9@CyiC*!Frz-<^z|ILC0j z;*{u9;Cf&F- zsg764xO!x1V_R(d7Q{N5Ce@1)r+%HI=`9nV6mAWbeAcS}L6Z0l*`M?nt)0gCA=w6B z&|VmZu6-#e?OO2g%?S|k7@nsm&f;vSe20;7&&!wEO+5c4bPaiKuIt7zqkOL~Nlscp z5CeZck;ayR=vEHVqdU#|DH%NVaHUni+p`E{_*?P!#CT{H^2Y#W2?{A2ekC(qUl;ki z+UcwF#Ft0u>IW}594%uG_`=~RGh3-vka^)Tc5}JA;`&bW%Jz`|sJS54<3H#VS)W20 z+ZCC==1Jy)XnglVDOOY00*AmrSaglvE&hy;YcLl!>JDEZDGZ){nJdjD$LboNbLJQihiXioG-x$Y|z4AI0=uOx|3@WdZA``{XFNpLY!8%Q*eIZVJ7mX6^ zZ?K7v)l#%pRia0*tJ)hDZx?4^M$|thv_An-J@~C-HfqTTdX9zi=WnLvqI9NK!hds`-@YU}07?*|f`IPCoMSO?xbm?{!X+an8MblKQ@nz@AqU7WDZj9z-5xIu9 z6>m=HKAHjd$2+iXrG>-Gd zU8Q8wsNxU2T^&f3E{*GC7U=_LXb|6xYAzH02h~;^m0TnWk;K@TrefUBVQ0>%!j$_u z#i|=vzyZTiLqjn4J|?|ukn3mhZ~60V^G7*lJqgZRWme*TeutxI6`t#>SUZs%s0qp> zXWrGM#+K9miDtZ@t~PhYbf%^Ax{pYsnGMGKoGI>{X$yP!A*X`+>%s|5(KjrZCU3MwJ`%Agi^j;1g32g$ol9ywQxrG;ZQXeI=tcV9 zjiUcog@2x8UO@BT3v)~K>{HPW{bQcR#dDw~_0GE1kF ze;7i$#ah(=9d%vlPwGvB(f}0NU$X^_p-X8BZI^H8Wdow+ql!|>yt;Ip{S_H@tu2)Duu+&CF6nJw9HE#$Ejz`0Nq1lNW3+F$Cf`=Y!S zY~O1{D-`E|1Gmd5>vy2_o$Ry8zqkb3+!cIiGHMhnEb?_)M08T)aKU-ib(2l^0k{uI zz3e@iFuMuATYAMq$)aRea&dEMrPd$_w6I$W&2w8o5AP^iIR4VSXW!8w)nD&POYK^8 zPYz>cybq!Hi$$i=J@k7bVe>K*MHUn{>#RS+IOIW3GL>X%cM{Y>>Fw(#OAj!E1Dvo;2N2JBR;2Y2A%8ZURt~Ww2Gc<*Y zwHrFtJ}6m3z`TZ`G#iVaRU%(-mYFosd<=R{&t>Eg|4PrKj`W9jQCx{8tx(jY+tJ4* z%_(^4uP$INO#4U)`bR35_2^gZ;GDvP*-G|`3I+a*6cpYbVD_Dv#wvizcgKTpo)f$+ znTR>mPx*{ysQb}_cE$I2gzwdezheR3{Y<2hbl|?&BGPf$g)+$<#)(&GCKJd_r8ugf ze)v7Ib2B8SW6@_Mu_)cOoX?%FsG)f*) z)tjLM9j06WtGUiZc#p=azqu{b=`!jv>x#-dOmse^bZb2WZ>Xam#h(8w=t3r3SoiVM z2v*3==q__36Hb8@jehW_-OwPX3b(u-^!a0M|7~a?&uSaNpG{#_zDZl12h2kc(x}eD6yG(ZL4%Q< z{HZv0D;J1ZK2nYvfp_dBC%zQl(0cnWa!QVKj+{q1>xRb07mQrs9hL-$M>DdlXQXhC zM1ox;M=tmwz4%%AF8!JDeh@I1WR=~M%n$&pOCGhpA|k9+e(Z(9W9sgt7{=lWE~Lf)d+clkb)lSiaCBbp5@ zM($`yF(qHn+{!#%qriqPIlZ~}JM-Rc7Y;&j>&%*|d{=@6^G7)>ya?~2my2d^y9fU3 zjlx(s5(LMq;!3EBFToFILV)bQ3VJoC4gw`!%?Wz|wD1~SiO{?Iq^NjL>8&32ztULT zjAWdV`V}O+36AE7e)}8qjO!am8E>2F!C*9&97bE7-!Qb7?a<^8g-JVS$&aR}hfJw| zZnfdg8qZVnJ8F`qv>^U$&&u;KU)_vWx`lHBZO?Z}{iu(x@&a1*%$kXOHTe}Co{&o* znStcx?9!Ga%ViAgxRVT@*04z#*oNB~#u;jnp}YX>P59cfbC)VO(SmTEiBy7q)`1|- z0#gu5)zPRH3X?7{8SW#7WUcDt7DcL=NZk`kx*aG#?>U+}TcAMr*;$6UU_O2pevpcB zKhL+ycT6`IVD;;8^0>idtkvb9Wv)Dl?|xugztFDZgy~!i6Q7rUg%K!_9vaJX%giGo zw-6b(VfdZB$*~&+!uZTm4X4{im>UI6#Q?bS;^FLoS9)mIu{ zPJeC;U)MLTRcOjHOFY_}RMn=kW%QU*L2K9U)crsbQbBznsOA|QxD`qG>;^Be2Pf)h z#_9N9x3DJ^F@FU1-<2*{;X2M>{n)DKJUk5M|J)X9SMYYM_;DYw??KMVyzlc_!G`jRU4?2so>vF~Ci4>#duN*oEqwFB9 zqV#j0>Z*qXC-h8;(rySpA(HUAKiwI+*vLulQ4C z2S4j+_EH0AeoH*_9bl_^=z8gT>f0I$8SP}Y*D*Kc8Sl-UFbcoUJo5<46co`5xevpc z7v7vUQ&!?-ezMUtgiSu0Ji;I7O!Fnn{+4|;-rSN7m!muVe%ataGRr+V0#9s9l7M!R zh@X>vV5-~*2Gft~VGSfVW1PLa)6ew<85Ju@>!s&!VrIz$tfn#JcTlDNY$mt0PTZrx zph;`+Y5d9_d0m$UR<;D0l>_N!IsprNRiBl##x%5$H84(r=Uk0z^cVOWFF4HRWCDc2 zr^JA~G{+aZ0S?|k3qf7fOD)g}&PAacg$m@V^(G#?2UZXIgDrFhwh(!AKH|rpZ zyUNQ>xazLDu12nwOufT+F2h_~;qU|krwPj}XL@&BXiZ6-T0#c!ZcvKT+MZ-{T!W44 z4BB>7|CrMy4?3IHOcN8B9Tyok@ICxtxJmoqG(7c3Q7_)6*`@*AHm&e;4?tnF7{2M6 zsXi#~XeP-O;5K4YD?ominf#*iOnr+^rEQ*?pl_daBQ32qw)Wh728z%p~bX*2ItW zRh@v5J!9-aqum$ynFg6e+QnGY9sKW4;0xW*RtjJ2hp6=yGC!?+H9;NWygkQ$@`Mg- zBdWWWmcf=0;4&+?pRQT5g1!m&aTDuM+Ek7)AC`d$9cWvE!!AaumOfPb-G|911ck;h z`wW>oxf8wjAM64})iShU1n`|sQ|F+7I}H+)#^C|GT9-{c)Uls=vKXnaeZZA}VQ-6t zGfK=D`MOGiGAsY0x8R~n6Ty7~E}fPv@4WakEpo%J`5*cTgs#YmCQh^`g>gy=x8{GD z!Ywibx8amOM%UvLHl(WP3fiTb+WS&Zurgk;lKk0zH|IQdHmh?h@6r_{UGi_oL`_Yya4{JlUEs49$apKHivfn`Z!BIBC8}KZdoFBvOa<)Zg z){Nzk72s@_wApll`nmeD@a3(@77Zp}>$XfUElc`$f1E(~N!gvw>04E%5r~Z`C0uNe zrJSuXTE&UB?$Q^u3h!tU{9NDQn^;$9f7`$@me z(4DEf4maOnoSj#|^zwjZIhc+_W5_DV!LUK?7GdNmO~%fgZXBq<2fng zJJ2#O5O=iVsd3|+^<(nrrA*=*IIL{LlbQz=a7$Q_#h?SXbQS2kE=S*SYeP45L@P{d zOdCv_&`0iK`tveZlj&=t`7~#;;ap|@y~8w^mn@Bvl8^oWz{V!W6UOtDO|#8JVKg7~ zWjVPi>p}Ln^5pHY?PvFhkv^*|B-l*A6*ygb0wd^niDpj|O5hu`lL1dxRJ?~dz z&e-qS9j{t`w6{gA*A=~9Z`i{DOo;Q~m6oZi)OG6j>K1heiB>L>;18?7blps&RW!=bI z5ZJ7@Y`OWj*tf0Zq3;~og9C8nZ*^9d!lz}G?>8}_R1)p#>XVTxywFxpSQNT z|F=({Pl|nfjpCK*LnNxP9Dngf+!e>kYP;&lf;PRmvoAZkr{)M}ds}6l@|PiIwS>_nk>Wu7R;i)I!guwqikNp%4>W@-YGdj^R!QPL zVTL>t_nGpT1%G1ZX03?^K=`k^(IC)=`zM5qfngx2W8dJudWoz?$?ohJ{B>9UGhKNo z33~g{@Fr&euYph9CEM#SiRR{&Ek)Hy{LtE~k$zbNO-VwwB%iC0>tk0jS1FhrEgnv* zba7U5)pCsn!|;^+cv@W!GEF8i16n@~*@lG*YJUgrQgeo=&7l-lOX{=}jan ze2(k-ES;;hNclSeGkXeu^)=GxJf)gO_J(^rDxU4s)7b+AQ{et9KX?@U3H`l?^% zwVI`|xh<$(A6l!%#=F6;;M07Jvqq$2`MkA3beLtCWfi-qz>aRjH@2tdHV}U3wjhRM zWiHm+6jU0UXm_yKYQAdGeKV@R6dvcQ?WQdy9!GQ=2(@^OyocZQ7OsyE;pM$MR^CqA zWh#PjFq^@FTp&TsC92<7W))9m{!fXmPmJ(CcH|;wa+z}#D)jHkDB9uNP0RWr=Q(y| zkyPa6ic?m;>z+K(wHnkiNmKYlPt7ngk>BJ8Q{f6kV!608gWqs#Zbxx_k$f9*Gm2aB z!|z1lvYCTY<}e6&B;)hw{5B_%xFu)W%#n&@S~6L)xN;HTtL1p zqDj}Ee9$I1ZG)uOR^T@&bA{sc-zQUJMH1{#({M7y$I$fIkBdm{KfH;%XjV+C}suC+Zr*wwPHNo*T&iN$5# z(%JL{{Frd*2<#~Ky;B4F$}I8CoQ*=6_@OgzC#jJLl|2CaNTWRhyCD)tQqoC?PT!Yv ztV-%>JNkOZ@&+yhTYPthtsr?}PG>_@*z=txa>bqGkyfXXw=P^xBdJpp31MTwU>A}Q zwvvpna8kmy!>jBgd*BFJVM&!|_t8N;MU&&H2}|$}=8yNOwN~0IzkzO_qvPl*%7r_M z2Mk<6I5@$;rOv-4pKIr6=c6kSYJynaOpy&H7&%|^!QMwDHWjVJDl{IEAfp%Gxt&zS z-C38ZHH3!Jmw2g27jUB!*ax*tS(KiJS2+X8ebL>(Rr?tFa=*<0m)>NEWKO$5qHpR< zf6}|pkN3KpaX1{F(0fMUlRuK8b~!C61qwHxA9*mZ@4Zg1dPl!O$-LWijHZf{%-mqBZ}NmP?Il2B_i-**GO z9WL+0UATBeANEBQC~p5C6(o!#ftKzJI6R#d={f(K@ zMS5UIXIJuvdpo~G8!_1VH5t-lU`v-sr^7yyde6LS<`DPaW9BAJGMB---i1k3P*chE z6WmGCHy6YhzQI$ol>H$i-Dtjw3kRuCgoThEG8TW}Lg|BE`yZx=B)@m3;l%kx`&;}D znwR%jr2JLIk>JNv9FU4$<|V%|m83PH*II~kVI{n7xa2z`lBu^I>%8!+Wi`~Ld*}gL z)c|8>rpSlJY^J*0bX(ys%D@pW<8AoMJe)*hcWW7IOAxFLctM`ww5kCQ-WL=kuC>os zZkPu0DpQ`KyP@Wt%yYFH?~jOui2s|$vSn3YTF?jvo@qB-ZHe{LYXA+)@+52(F+(kF<1?she zpXFm`FFZLroX=3*WuhsjGQ9N$GA}(Pub)q`qDcOV#=0%Idn4YYkL$m?*nVHP(xMpqmfpWMOrnEH zh#RA81TQyVZzq*9g#G6Vvt0%p*Yh~%58zTAM|av@Q(f}`GN%8;Wtg4z+#~#Kv1khW zpqJPWH(i9(vsJdfARPnLC-jGP21{^p4&h#q+Jm%8c@n3l;W(=TcJwXHX1lct*zi_7 z3l;PuNX$u(pREbb#=gdnOvU(gX5)L=h#N1)bd^l8At*q7EG^K(H|OnGk9z63wIKNt z12}uL+w+pDIDl-VoN7frhYcv`ZmVh88hY|{?R1=gEiOZsQLu9gY309@FOvi8{19!m zd?sF5WRA5r8nGwnH7k>x*M~gzRWz^Z(V8FTj((ui>#Kve9i&w+qoKNCJ>JXgxYE19 zea}Qu{fD_I3W?#Ux4-3H*=`++k7PDK%ObMdmcvq)cQ!$HpG9^rmg7nOMCpM#)Pv9d zfOfHNhdwVFh6S7sMaY+%K?cKfqZ7>HGEYWD5Q=5EF6;2^m**4i#{NCqwvD|jE2*{L zKBas5(C7Wuwv&>>ruG^j|7x;(V6ZNP21&A1EJ<$&?3@uuX!p3pOx#+2UV zVaj64F8x={Ovf$f$+&239n5K5z}5goeg|}JU*JR)-k`5QC?<20k3pe72bJ1tw$&x@ zQCrFWJ&H={l4IXH>JSQ$lv|$UlFDS|*2fF<8Oq{$qIIug7L6Y>tyg^7ujoV$q&HwS z=gvOf-!r7$UPLQ+gS6873A(R*Wsk8?lzpxp$h#&yrxE1Mi>cM;J?GVTzwd64W zYFX*Xu9_?%tJ8nZpT7GPJOqw)q+zUKBFdo|WblUJkXo9=BNh8bCG5-j*k3mHgwR$R z`Y+>|6;r^EUeD1Xqy!8zjYI`85uMMB1U|vF$=py;@9gw2NOZIr&5QkM^!Wxg`BE5! z1DyIdQAMP;WWhgB0X=yy%eUO5`*0?mx1^(MAe*%auD%Ya_a?x-O_v$$B7glc{F@K` z#UgFJFZX{KT2L`7|Ag1>3W^C2Qh=H;Cl5joyuiK!1}6&U<}qhy0hCx3>9%SP+ZzH0 z6DpaPU9{DmBcH-eZlc9y_iaym z&R_mW$NX6WH(hPc;BS@fc+o}9Wh?D)R0W51Rv7$jBmw*hrs0FqKAet`tCj$6o2RJW zy4w87gN)?N%|W{BWO`dXI92C@mPde>pFmx6m6<_Hic5C1fc#@YyuacP*ppVUB)hc* zNWtBps|)5B1#(`1WaaZrQ`e0haN-m;cSh&e5+uPLp8F#vq*!NqHso>49%sO8v&fE= zrlh>yRSIa^z_whaYhg4uXi3nVvWE7wrA#tjHdZ3JU@+RE4W@MFmgYq$S~T3&qhUjH z)7V-Y4EMRM5}6KH?3>g8`X;kT4OnjaX@@C0bgT6ip8KjK&s{T? zn8FfF%DqWZ+^znBvdn{Q6N_l=z;l#E;AY4J9cGL)x> zA{5m|IGgoW<0ZN|?WnxEqE`w*t2C8KCLBiYLtIx?(Ga$v2X!jl3ZhxzwZ{8xxR$qc zQu&Y$E)vAdbd1&}qp2DDuV{|(CZWs1O%|urJ|lCNuGmDER$Wl}G4QHWt7UOoL!;@^RMMZZSE>{jT-xjbtMC5BPYmkhvR+mh~|@ zj%M(%TODC+$OFNnLS34*anFFrs|!ZU5v3H<&H@iAs0)ILKYTE-UPm?;{5+V ztYOa$LQEBtj7URx5!d5C}<3!eX@&#VV}}*s9gmTE1?zE-kfG zsaj22YiXs5)wXEWQkP1r)l^)tqWQl+Gw0kb_d-Cl{r+FS3nz2VoH?^T^UO2PJWDYr zu+Ii|LnBUwp6iP}$I`4C{JPzgH3E+|{c{dSO6|0q@8Hd*7aDGp7?rcp%;^hv;tr_B z-?K}47ahw{c$b=uW!wv?>7TH~atD%q$8&DmhQHLE(6yZf)7Ul5W3Rsyxvwu3U5V`1 zX0(ZiV~!1yS*5WAv;aFOOX6yQ-3(Q;8OyTU(0zCrIr)#k z%17ZHDa&YXUX0z0JCKI|ExMs^8{L*<>{w^9*P4V~hA(A&2cFua8NW7`_Xpx-{S;1j z^3ZB&gl4}HYn+c@IpZ&Z*8^{GHa;3&*^JED@WWPTUWfkZBb)-i%+4$+D;eLq)<@q= z_CAeStFWx0v*C7Z^>k*9#@|%~-eoppY2(A}W1!5Ja$5L6&P$x#jAd^r3G#Y)$nj){ zHX_M#C(;+2kZ0Kv$F62~Iaq0jOoRSO*M8LA++le~fU(m!_Yt;Uns*I$fbM5^`RBY> zux*nBN6VgRm$O4|0B4GWbq{>2r;x8W0{KMQk2)LsC`*h?f!1d`iw3jn2ykk17P^%e zA*&^?7*DW9{)rXx9ri@>s~0dlthv~yz7&razbx8SG`KheF7WE&8_|GA&vN@Z9PUOw1Jjb^)@0mt|g!eApdWv)sygiw}Lz4C6iW475J4%lZy`m|q&}uzjR1Wc8_^+nh+X?jXcEZx!SU!hl;t!aQ?><)pl5JQa2mMhD)h~t4Ss}G zpJ~|by8#`o&G^m{<+k%6tSU_Fre4r(M*rJ4IH$~k=EK!cq?%IRADW)l8-As4XAyv_zzkm zcMdi(J0tOD@e};4T#U@$j`SAJ<2Kh8dMfu}Pwp%TX8KYazh#(v6Pe+3+$-vkG< zLSJkA5^h9J-k#b1F85n`Z|C(W*i!HdBnk_P9^mxyNzT0AM# zcu!L~2Rj$}yESk#zJZ6myMrycw{y;0jCRCCJnYRyOL{Zb&S&AJ<`_!6&-(9kh8Ws< zBi4kT1B1VdZ_9z{$E622VYw5pb}yypA+gp6DZ{&vP}&+8${FIh?7beyT#)tetf#Zr z<=mfh1X?a}yC!ZNra80sfJHoB2o1JzmBV{1=U^ z+y~iTLtpXfoOg1@Ln}?flG;~-H^R64d+<@_!Jxbe!08|05x$7V%WLM$TQK_}Tqp7S z(+tdZPnzLCxc^-tHVvJ)U_pV|6-`4byaKuK`QY9K2K!zL4+8Bdb`3jYC>f_P^5kx$ zvCuR&j@DuY_DkmDzi0tGq9y3gH8Iw!;T5%^MYoQVz76QoZ9#kPSv*QJQUoE}{o{u;_+u0i#c<>K#%AwJRr{#yJjLYz2aF0t@ zJj<@>-)Tn}KS1Zgul-v3_kqkO(w{Nfb?>M5N6RP!58!zjXTkNm7*8sexBu&mCy)Yv z4=QvNl4DZ?vp9vj5`8IQ?I+QheGiWKWGITonT`75IZ_X+ghFto!TZ6me$a##05|9tH3h>4J zgjQFtjAKLRG0qj9&mEe-6Yk)L=o0iRJgV?GxP#;2b)Sb0!IQ#YX+w-nwYs$9p}?dU zvXUPA1{TZC&3F_!UOy*$YpJ_4afq=OQk(uJ8Xno`et#0!nE9QoAabaWpuhG7bSVbF zA1Kak;-u}S{5KfMG3X-Xi91&@#GEtq#mm!(w38XNW^_%qp(Xc^jI~HNeiI+f_d&N! z#Y5*mGM8p=;)LOGY~2mPgV)UbGb&F{hu8#7~)(C>>N6J_FB#cZo)#v!JcdFTQ^kutPQ~Ly;x0oIlUie3{MCC6?i54 zHSCdzPxBu7D<9|d2=)o~M~CIfyq7qeJO_^D4;l4Sp~)s=t7tZ}{3~evUyDbP@4_X2 z0Iub;#%9r**i}xA!wDAue09-_!))uVM|@oc@oDRO~`lqt|#8XK!EO;fq*bx`JJYR@&d-e`yVRal@g^zKf5@t8&iA6Y=kZ6VT?`lADF+ zlkxdqK%cKCIDA#XGo0R}V;i`=@E=75@UB*Z;a)>W54=WsW01jJNSoi_jA8=2?RU_R z9Ka6wNvtj8A^Y8!c@ezKdozEAZMqLKtC73u%vz2u(Oa{ZApx@o8wDQ(osC1BXUXe- z*gFT&6KqFb^A&c_PIh+oZCDb0IcFSvf|PO$D#9Hy-|} zRuFl{6P(3gLHy=iyPUI{O0dxisEljb-QGw4|B;id_u%Rsjvbb4D4u!6=faObN_o=| z=O)@TAnglq*>2^`@(tuupGEKP#H^|8y)S{^{}j5uUjcu-mOVYE9$A7rfRqU z23~0{G}fn|V6XiWayaQ&*vTy_#IAT55{5I2&Olb>Eb4L<_1K8jK>6g`8sR->CzRMb zc)nd!yp$8vHLOhEMr!3zY@A}9ryU#zjWQ?>L{EkTxx~QorN)z8_b|pk()MB(pf{Ff z{BSMv(&u1nc{Lmt`LVkVTI(LTn497D?~B(mDC5M8lihRf%kUQV=ZqscfBPP`A9iC= z^jz%N{vNBeg~-ufi3acvEP%IQC+aCqCwUNoU}b9>oZ>kj88^Hs*hcmd7qIle~MUV_iNMy12qv z$XtPKp)Ye*@xPoPdS_05-ukkze7`Ankvb; zN91NRE&I%{(;MVqtLuY%Y7Gx*H%_;*r%R{m-EbMoimsh}ah zIe%qHgX$rpOYk0+phgrNjs4X^IL>9*UtI)`=!$}GAboK!8f?#?8?XKBG5Fb>iuUcY z!mBwK{#N0SkahbhnoQ4Q-|a&B#@ZBFP&?KK3zZ7O#SOYZvF4 zU$XJ7*^jg0Gm%r=2#=`)Ym(!Q-JbF;_ImcUhINN3`)u{#x^knRMJMis1XczIMcCQb zSxSZR$na(M_c!AY_>sV0v2}4WHmS}s)-Jx0xhYe2-d@c75St*!WQ~IBF%H{(ld{V2 zkMK3}aJ#BQWlwjWu+vDszWGdUS;$-WxiqpYnz4G-iwd>o9-8H-J|CD_8a2WoS7 z&Isct{#-22T+F%nRX~?LMQKO+_cf!(Iv{r_(vpGPS-Ep^=b`tz3P@X%dt>hZ0%gC+ z{T&+RZvbg2NcrWkE}hMO<}29xeGI=C+p!q<23*xaW`#Nx9~o!l&&AGAli@Lc9m%Sn z=l_W_;p3nbm!kc7Z^6@8KOBx%ml`->_W@6P@n$v6>{I3gM+=Io@k1n<>^n&A++O^B ztnT~>?d;zf|3Pp&5aLNTJks8AJO<5%OZ6S=p;PzM zoMpLx$^QbjiKb!;tpGXYbCAyXD*gpuD0&Ny&BG>g)SD*C5*yoG^x6e&qN}Vr6=HZ)2Gd&8Q=&$LMuru-_Wa!Vq;^6P-tyRF_TgYt; z;pDClw)$?(?g2!t&8f}Zg-6DLNM>hXW9B>g4`N;HWGuGjGkTXHCHWzBITNX?3#iMl z;7cW&v;N`eTYnE(#cKF0o!EcRhl9Ncd!3hY`g|MqOa2fTh$pfWkh{-DYOw}y-j^Ux zbQApLd(kR=0h_DqvwoJ9gHGZ%kn-J?{XQPluf%7^C)gsoD3}J{E(IyhC-Wv^^X4Z| zJ-6cL;eI5@evAIa^PEHPEf|Eh@Mv}*=7tAh5cHSj8+SmiW0$)EbaQ>FavT2&ps3?fisaOJkv;zv5ziwcXAcz;81D%x=9CiOS=%ve>hqh5tjzQvD6d=!H4oLrdV8 z;H==+*|DFPn+=cVQck9h#VW-0oKX&Cy|@DV1D*MkvH1BAGR67$S9-MYT(nD`fme`& z?Y0VdQ&y*BgW(E#yr_raAH2}jw^viL@p~Q33mn4<(j|tUx(M|TC}eFaW-0v zCU^xBnG2|K8{GAc3H4~+EbLj-x9FInQAJ~1iGM5QzaDwkZ{i2z!J=4_K+x-?+6rVxH(BWL?B>Vy|L3Vfp_UWF( z%48b0fF>d{KR>R8$$d!>KF$jCE)u{#6&*seE za~9N*DgROh=&qH!9wPUxwRR`^FAri7^tWiQ?SZOF#p+ct9KKaZ;XQ0@E5C36HkBu1 z$ML+J6*=pWuDZ=gS3QYL-ABOy5>yvp0q+H1JQEp}%aPaGP;h*48E0ooW|yRuI}()`7oV(k9D930JR z`Lo;!@FAbdI~-4HmvGAWaeg5y$w$m1>03@MJPlfEPT@Q>FK>4}$BLek^zg3=tKiT% z8PUHsW@0xNFiRLis0JT1z4W11_a ze1qZ6-3EW|Ex2*-qtz0&&3kS4&jB_i8#|oQbH6JmdLokS;-6F?l`tQP+{AJ%2ePM$ zmg4neXJIVVW;9kkJH3%T&N}#fo3SCY10B&3^zO=x?_z&f;8%fn0wXw; zYRIg|M*liwQ?ET>9~6RYC%bocKm5-6j4#xYF8wzCpgp2)bUj&Y+OLG_9xRuP#h#Zu zbN?b|7Lqlako&&`*~sVMDtwbQ+-XmCE@c0C0iKnv=CtKzR;PC4p}R^$`{9wEYu535 zu?o2*U0kCf*qQJnXC}N=8l~~G6v?wM;VXD^T;ISJQ;o-tStZ)zX9pHU>?f~{Yt?Kg zmf?KJ2#z<}d8J5pR098J!!N2f)}ESNy}UM8BKcdHw_wZgez^G3ukDxR!89Sf$L1c7jh<2@P39-?5_zS2UU>()wA+n+z0jU20!6T7TSi)ZWZX}bR!y3dm=^tZ1@fvp09h~!B z1eSiT&{tH7eR58Z(D_L==SRcRim)McbK39H&f=`#ia@XIFCx!94ymQ7ZmgdK4sMv*%}6#(bXr{2Vk9ccFLVGyAT2oDQX+SD%qlhR)uptVEY{#{5f8 z@Ut@4AZ7Kh%xo;M{sOFbJCf6nAdmezlB7eiQdOOk9UPcD7whRapoLe%9`OP!_5F^W zO$O2t>yc+W53bxRMH7%u_%5^-HbT>U#=b@q8f)V@rTI2J{?GKfjK>05_*wlq6yx8S zy+g8(hjJ*x>mcB;VwE&Qjac zUu19hA+}$wrPn#ktuGijy9~kJ-;77x=NU5Op#V$+F4ZlC#R3i2oW${4y58pGG741T1jfllNm}kjG%3 z`*M6VZ_E#1Md~?Zkbj8Q!-ePR^!L<_>3wv z6y!-}T3{{v^q!f=v0HvT^D9s#w_?+C3>M+8gaEf@aMg&S(~Gvl%}WJOH*prb z35_sL?HBl*jqG`rB4xZgZD#saSOuI9t-KP;Hy>t<51aB&12alJklFqrvX#F; z!~OTr&2zCTbRHHeu7RU40on2!bN-lfSTK)O?>g%F6Z9ZI4ju!3SPGAG8xmu?jBm|7 z%wQ+4cO2_;H@Mf8?tO!`Cs1@|(L&B9+t{6c7k?7> zvp;=-bMisR=TzVY^n4^0FGhFo4o2s7tSUQAK4YtYFnW3cB!T8bQD2<)RlHr@i?yk( zaGL&Z>^2NePXVW78atr!js0b0lD=!?3p>+C8>_|F0c(F@EtbsR(!kaD!Tv+w}#S$UF&si#LKku<>hn80ni=4@cn-h4&WyR`w9v zd`L%PQ^@1d5bbY#)5{jacvpV6B8tviiFC$IV1=$YVJ|e^NHhgvtqskF z=35qhHj2zGH#!sg~v z=oYVn7FiQqi!RR`(k}6 zx45SGa`>U!i{D_+3VxvPlGBbwqGuYsg^S^`-GaxC?VPqIVU=TA`ZA6C0zCN4?hO)qOlZDYHJ35GU}1mlB|{_ zShPpJC(85XE9~KYhUYa8e@2fYC7GN)BK@_%@o+S6!Lr+<@Ks;W{5Uf?>jd~DGm#K! z&bk!+uKF?j)`Y)-?1skCRm zj8@A=tT{f4RITJ~KF&)9g2td_kc}km6s&@siAAtlB)(T-5&3HLYk!1()^m6v+Jgsx zqwu{~g5>K$=)A9(lb;8%S@RNFJ44`C$hN^^XtFB`zX=umIMUMpLXwR+yUAzxm?xn3 zzC3LW808OGgXsfrc_N<5z6g)vUsye#j}7Zfu$c5CbV+t#wOTd>4u_Lc&+4!x@HpI* zm+_D?6jv)SPuSdh$PE7EWP({V8@=Cm8#3OA^?Yy8{WmROAoJ;b=Yp zPxFOfA9N?rM!$b8@c1}d?WeJ?`7)UPPiA&qoBs>6)J|sg{T&j%hZmlN zeC|b@MSKgWxF4CSzZLdDt9=wwNOxeloHn=noHl~P!KgdHpL^4;$E)j6%&6<|w*5Mu z$R0%Nz{wn$S%}=kpRixn3oJ5<-9{l;WFF@+hheMi0&KIsj)u!IjPF&!?}0B4$1eRv zoUi^-^g#&+8EWB_M(#qgx=p$7kiC)Gdwi1c&t zE`1Gj=0oWdGiGKqK~p}E@q0#kFuRSVSh#;bFbci0v*Ddw3_b9C=GT!OOU|Bvb&EQD zwLO(1{{d6s-Z#(-YoSj*K!avAF#RArv^TJadm>OgAL{yA`={$t)On2jBle7t8l9dSSrgU-3rt4PfpWsK&j> z>z|wTo2*x|W?&)faoSr1mb(}|vM&c0uv`9ZZZ7n~wbWn$Hc{tcq4+ek7(c?o#!yZX z#&Cj=2WCDU`R;{CcCUor{52#$Zw7Ym!#41*k+J_X_AcJ$lxHB4pPv4IK~X7ZT;*|2 zx#CM6#ltSKvT~l}!k&Y+JhKvR{$H(rzmwwZ3dtahNIN=h3U)abVIgE7bb?MI{yWcU zFUpvU&6IOkrh$|KqkVMq&S9p6gleI-^bWjHqMSE-B7@=%&#jS?JQwnETu>eURD14~Hg; z&xww=m%j+k^aJ>u{1@^8M`cdHw@o}w=apdhpJg6_gvtu+iQRxk#3P&?zlw*o0m!Gk znEg-AD6(=cf-b!fO9Jg+^i-&a^Px3=iWbg?d4c@t`E^K5{}dg>xAXg8A!}~I3NY*M zjm4L_*f+U?v$UUcM*l(KprQ##dMsiuawF%?Pq7E-Q+y=&W0U2L`BRK9$zFJ+Uz_%0 zc*lLy%hFfk&*;xkm+7nl_d>Hj#o6SkVBht~F&qu2_3rF^lE2X~?;_6~BH<+C_Z(z`&p{sZV(75D)BcfOhV0TdV<}GlAa@;*wYXCD+vP}Zbmdd8Hdf>= z#p?T&femP~+yFJbku&W(In~?*4|_`--yDff;f_S|aU7QC@{zBogKD`38u|}tSNF_6 z5?<3BBzZ1jS9u@YGFdtw2-md)TV`K^!+1NEYW|2ls@_QKOn~B@3*~k};kTi1e~oq5 z_pwbi3j1brV(ggdyz|>;Px-x~yE(P~G1_ns!BPDs7Ob9Ne4i=$6Fbd+a0=7|Pk|YD zbJ@)P{|(7vPfRg#;(2MOvqqeowh~*MH^QxY2Rd*#dyZQ(jt_ht*gcM2#gp)B{8>T6 ztJ@B>aV01CGqD)lh*tUS$Ur5dlXDWbRc}CJdjRq!bMwB6zQ8lA{z+IPzXy+_zrhyK z8%WLlv-KY2n%^!ML7$h==L^`q|BAjol~w+_qU(?xc}O0t z7Nj^Gz~pOb*KlI;Fm&VF>EDJ|vKe@M5&xWD!wcz9G*#2l<6DN!ty?mG%-*_h))DLw zg4zFr#e>V?mE4*A7j#b#NAq+nd$LP%u1DYE{+vHCSKbenQ2r*xfmr8#XWPAc-#J<01R_W38Iodgx0jl_8+xUH5mhzpr{8;~cs z4UGFJ8lz9cHGY*H${x5W+4zl~$7x+%dIRU2tKsmhWlgyXKF_z{p??oalFj&v{yBED zo=o3~BzR}~KX8rZi)hXARmInoD;f5B30ByHCT9{5x7-@1x0-5g<2ql*S$LE;bboe|)xo2P-q?&zAOYUmUS-+jT5f8gR z&3yz;@N-Dg?ZVqpk33)AVQ_^5oWzx3qe334>+_nCfRClUp3p)K6Aa6nqu&_#&1Y5d-2|B$!NC8b7Tf<{S>njElgXQ)`(xR%hIkuyX$sN zj2^@r+pqB*{1T^O@1*sF5<5KoXmk$>*+HM3UW=73rIAvZKBw{f9^b{MlHH z{s>u|AsL5f9LL#-&bFr_v-Usm&zy}ZP80aN09l0#(Mx=o8MilWBs(N|&C)r08ea0G z{anC#V0Dx~Xiw^L(?Qy<&{^*i^gmbUwy|5@z?!)cz4lFL3$*8MH9kmp0$Ux%Qk3xh zyWR5IVfCJGLrZ6?YqQvgcMU(%a%o0mXBsC0^I6@Nz$IDDZg(B>Rr1Ix4%!wp?6$HK zkQTFK<@Ufill{Bl(EnqxdlxL4Xe2x5Bh|SC`8e^h*P-orgVF!mgnmss8erRznA-^~ zbYLOI!RMCji2Kn|PQ(6+vnj>+$0|)Lz`v*Vpz=R2`#2XG?`qdFZnqg3j)&ohY{RDT z3)uXA6KRgU=)Vp!{^v&4cj&!<2UW!`K^@kF^(! zEn%ID^~SzLDpuG=V}~sherc(ZRXE#tuWE(zyVPhe-vqsPkC9h+j8kjLS-l!~Gw?1} z0(xf-LRw)YUgO6@*A--1iG{O~R;Y)Eej!o{SE6Tl6a1Nb;Dm{zy$#v)7dYK|lasBz z;KV^$sfMFHJ}VQcs#2t?#BZ-Q(&!h$Ib7$;DePYg#IBFox|bW}=R4+Y--H0+V!p8PHO zj~NPO7trc(UOF89jwlmxeHUQEel=9d2B?xdIWuVoK6h|RCErl}@Bt(KZV+Bf1)BCt z(6DcVhbL-d6MPuy*6(yJGWrZ3CKFgJFPe{ZaTA)i>)_&UgnPRM9mMU>xx0)7`$0h7 zXyC4Z-D4%Pj`i#yFU2SMO;~K&3^lhcwBEl7wW&4VX}5b0PZrsea4K;9xOq}d^{#H1 zZ1if4_w<<`bM?SpaP1H7akUb4>Z={2<9c%$?pnxB0~-awN7G!(x=SKF243sh(Y?pD zp)35e1gVnMu5bESyt4z2>Hh5HNXDc*MmN3*OQoyXQMMsJx(=TR8?duseM6-pV=^*i zVa(%Sc-qVtvRk|q3s9aG^8r{ShXsCzY-b;dyB8e zYt!5tuhp(cM^96r!^mpx%@_`T@q=N4__&aj!UgP#WtngjJK`+|Wut5~Hk7PJiPoTr zNX<-xLtYWAlvNP3CN;T!+13TG3~oT1%^SlTLUvNNa{9WR6DrSgjSu+=jjSg-AU9uj|6he8+b z&I9lt;1tPPZFhHHk(wF*NuG5*v|+2u*%LOo68!98l-mx>&%w?V+|5iNw#!2^qL=vZ7eif+CKb1IBi26AIp&k zJGwoX-|hG1XWQ@kIczJO3Zx=*409(TTYsJLxAh_1MA(;bJK+Grj-K+ya?vREGOJZ zxPWjAVH4qY!pjJE5pE=OlBgfyaKgy;I`pE(B`qdiecDd?X~gd!ToCi#aYi|RNv8jZ zM>N&hK=@a}I|*MVY$tq$a0lV5gdK#h5%%lnwEd0HPxv}vkZ>1a1>xTbmk|DgkU?sD zgYX8zHwiZp{*!Pk;ah||3Ew8%Lx|X_;=~J179@yoN)X?cAbvxF_>BqTH^qq`M19)h#H+uyCy3vfAig6( zyaNu?FS7sj>`M^uPY|D$Abw(k_=*Ja3lhXPC5UfJ5WgWo{Kf?Fn-avgCy3vkAbw|p z_>KhemdJ|J|AzSL8t+dKpOzqgVuJXJ1n~Vf&}qR3F6xl#BYcbFTA=jLHwpT@xq7g z3F5aWh~JqYz9T`rGqh{}t6X1#cz>LD;mI`ONB(V?lPN;R{Z+gk{e0=J=;tkekA8mh zAJNbLH=~~`{~7(f?yczOhu@BV?&uh%{Y>cB{?0Jx)rjZY-i?0W`hN6tDTIFH_o@Gm zetz|%=;zHJM?YWM8U0+@BQ+|&(Y;cw&l|UfukySzR9nY+tatSDZGEDjFYO!seQ8qk zbMJns#*Ubm<@o-5ug#eI8{|uMwt5eQ&&E98loI{EdT8|X_+ioY8I&4b{x+U>M&y6b zVX4lpi05k$k4|5CM0EPh;iT6_$o-8xD%F|oJrFjTHOBr{MHdk>#OZa7L=_uRJ5w86WYyWp=9bYAAQdxoHmdjre}_nW@gZ z5%nE@4)xcj-2H80gIW>s>{O>(TdMB+OKYOXqqH{F_`&kN-?BK>nHEu=vy}28@_ToA zs`GHf^QQAst)EXfgNhZY&Zda>&iV95#B=3^(dDOpIn~GkdF5~78Gc0Qx2KKoBgVJ< zE7AFFT$d_7M(DTUid4s4hD_W>p4lIVeyhKc>Kx|M$%@>-#{CX4L)>5R?o{WuVqUnv z-kVdM$B*=$9B12;sm_88;pg$^9_HMCO!)cLFCXTVL{wnx)rUDiOz2k-^IQ@0Tpjbg zI_CMxnCFc#&zobOx5hlb5c8bmOy=Jtu35~xN~e$eT#f`vKXYHg+tZyAr;Hezx`ew~ z&KzR;niSK_y9zh`bZ08*m0Ow9+q~D4y_@Bn=H{Wdm83b#E%7X#=Wt)*loC73nduDT z-YcinnL=DS@5*>Pm^X6?mB;Di68UZbar3#9qSCahoTt8|QC=1NJBzwZhb^+Cj`eP>diGSY_Y*^7A9Z6N(|dYt?R(l_O#SD()$mvU0;exUg~ zpTAyBY`VUr*N7=yIjJfLOUT!b!*o;gSHO7B5%si}P>wbV$>0mhWS(y28H zE6r$^IkMDb-)MYK=Z)ZVj$6(gV9P6HxhW*G=6C!N}8%g~pz z`BpuxT3MJ;&rLPZIh$D3&%P1#3eM~-uy6XAwyLb@#H)3(nC3Hf!~NV(8R^`iE@IzKU2kIqg%SG#+)4dgv(w;tQsxp&{$t6F2Z{9F^c zygqB=-up#%AGvwa-3tfYY10j!4_{^r{n&&Pv;`E@?$}?O8xr)~=s0~U=u5syreF2* zzPC^2uWixWot>`_@9cd3+nt^7|GBgCEw1OeUe6CV*z1p-^p$sY(06<2o4v<&c79SE zzVxhkz4y{8^zsPjYC7Ok^_gJENpqaeP4vSiC+XujSK%h7?~A(HoIXF}dYEpz&;iyR zr9tNu>Ew0iv0TMmLzv5-s?TgQ;{O$ZiiYji#wKqf!0dON!ks2g zGo&Z~B14l_@0CvJ^_{+t1auy$cK3cClWY%H#~NU#nEpN1Uc~KndUUx=S}%>#>pOj~ zd?J26$NE9=QwRQ;-6!~|TKj{u z$f}b~J1^ha z+4=Lo+GRoCDv!PiXpOd*wtA0L(CNjJrYlL;UY0nnqjX{9Fi`0@iz;}}2k|a1pHCC+ z0Ws_9&;_jQmD} zcJAbAcdy3?_v-3V+_|?u>FM{q#o_CdHMV5+*Jv(Sk@Q|~Q!VLhc|V_bW5PDa;Xfz2 zHsCL}PJ4ShpQbQz^CWbk$4)2E zVM?pGJtmZ+XY1lUyP;j1M$`AhxV-U<OzD0 zsg9FJyK!sPu_i8a)F_*fE;R{BH+j@3n~>I-gpQLrYMf0N+|8IPq2pwXy5$!0ad7wA z-ELgoI1=jP;2wZOAM@=kqehv8>MfJdaV8UE5~`a`LZm;&<&7GxgzJL>8eTZgEw=`4 z88w3(ffpqe%;W_EHX&8E32px?p=pZ}uD5YYcs$inLKn6I%282jhaF>XNob->j`mv; zdi}ND!m3i_jk4)zA$4)@Z*@c9D?G;kZ_Wn(e>G=6>+uY(UX==+$VLV|d>aT9)t1;e5RI2E@HaQzdaCVyOK5*WrCywu z9}Zl-xNI-KpjK&HZoD#zYOD1PKoeQ6`?0X2SB96+;9HX)>&xFv!eWC)O&qz|Qr7J@ z3Dw@e)s{|CI%tDVEjx-Us^v%PNCf=axWHS)nX2sOg;(xdZ@r?p;Ce`PFHRBqF<6Abqvy`@Us;BuwTkg7z+i}FLV`&SlD^^^_ZHsJNfORntv~jnT1hVfSKCqSr zlz8>ST~h)J^}W&r`Cf5LZ<{iXa)=9bDyiZ!?iw{(pYowrP!ktede^9G6G><7F?A^| zt-Y&cX$hZp?pcc>n9?o1Wy&o!ZY>76ZCqgK=(|c)XBCPx}PY%*15w_BIY88#USsj|&4n-<%jn&HN|+1XyOaREVs`2h?{_j%4wx8wjg z#FWh+;Z*&KxdE}L|JOmHn#gs5&fV)wUk6i0+-T@W!7wvrH|ee!@eNkI;hIfQw*a={ zh6Mr_n>Z#D13;WeXg*J2Hh_Txdv=4rbNTAxly6+K7OH||YuDR2k_Aj0$pUU1$!r|S z+&CpOaeGJx>8di6jFO2A6rX@vR}+ z*u$fF<6J5eN;HH=ZxuPJi9&aqgtpF6BCzQ))Na8#akjUij%;t6II^K{7!Ynu-;j=O$tx`hc6KtFOab;B zcinZDX}*Xwa}(-A^TZ#fg%_u48-zk)zSWYE$DT@vLKO-UXGY@|;&uyQn4x^D?MCKg zD!rDH_qcJRN=s=T8z2zV+CZn$kr%(aXq=E%=ej*A_bx>RXrP^+c09dWyGYHepI2pt zpX+!=7HrCnjM!}+RLB1}Kiz&g==mu=!oUa~!+h?&pWcP}3~lg>h=4z20{(K_EuPUf z_s7@f*AHmt*Ot7>{0N&k?n@#}TGO;@Ra>%i`JUB|Lj4GtG5p%hBY(X7wEnApO6T!N zR&($D4t4$8ZN`I=Y`q5!{K)(UB|mC@-F|lKx2^rrM>mH)o`2_or$H$QrTE&DEngC zj*mIG{aDW(PKUE*+KxTzcC7o0d7u2j2g$r&|Kf|H-Cxv+xP9)t%08R)AFtoB?nU!` zGN(~|zkUaVhe_YzDE(DC*4gx`3C}O`)B6wTH_9{h)3ciExV65@uIrnLiR4?Yj*z81 zRQ;s2%Hwmm>sI1G^pjz7k;J3!CPVi`{z4mVL$8GRC43l}D&pRa4>8L^RAL~+-VU8* zcpG+;x5pC+ZSX>rhj$Y`?{JxJA!;+sCJ&|YHvX2*vizISMlsBN_u8wo2J>yeW!{CT z))2ehoJW{68Mjylg3a4DKD6NsH8XUhlM#+vNar&5Ley`FZBO1_8kZ4a^DbSa+(R4J z$)Y~>3*E4hwC6agx0s3K&3kCt5c^+eCT<#+p<(j2d?~fZY=A?}4BbSW2ZifxsqxS; zLPQ#uF=FzzV;R~=XN+=pV4)kTcuk7w60hDNsy=ia5s}7au()|w^M<_bhCH;B3*GS6 z<8_Casl@3QI@aLcP2(|YY=0Xz8hP7|y-0Ywe+%812Cr3KA?B?fm_E07$0IztXJH=0 z$L4MLcDch{27$f`Z5X{9`o!ct^BlvB4eeG!$1Hs0rEwWY%9{zIiia2t%G<4Y=mr3f z?r(3`W7C@Bnoyd6Wk4x!kB=B)SSY<$U-t&)3;&6C>mA-b*|Z{^Lup(_mh$%ak@`4j zYsUwn9kaQ)#ybb3iw!gS7H=0uQqt=9D3r!!h$(N6uNh*XD7of^3GGepFxAUOn7^Uj zoStkW!)YvIO?ij-qaj9&`8u>i@NUexB)d9&60s}P!z~`3wP`Ga&L(vEtYLzh;%Bk6zzJP(7g(G|5% zm{`o2HydG)ME$*3qy^ErwR^l(?z9upnEfu874 zIgILEI??3kcX}!mJ=vXhG&D4rHk3d3p!491oz8=_gSB5-cI%hoRxO1>Db`6jAy5(^ z99mhL8SwiRmXr{lP+2)=a! z@J0UcbM%LM8=`c~)8H2en{Yc13ES}sgQQFC&{bYu?r2ONBvdUAbX?NaYcOC8nDioC zF?a6Vi2-NI)SB8Flt`vjuBu(Ra-uV(#-wnjoOxzVHR-0*)Y!0=_>56bW~tggN)tXK zkb!F=Jslq~?NB|Fxjv75G{x}Sw$1E2IwC@jFJ~Rd^WJSwdHEy_viWGksoZ%C{r>a& zuqJJ(wSUouhH!O16B_Z`h<%MA(Esy%4)vdUFw6%KpQB^jK+EVDl)TCEJqC6dzQ?BI zN9`AuAJVbSCfl@4&&sE}d=9~&2Y+og%Q$~|qnFHo6Y!T?uKnW!!MlEZ%`f0s_)9Y( z5xscsSbez@AWT~KdWXV(>n?9I;Vv5{y>+>XCtWYagJ}XL?Ch|i_uLN@W8S;v3FG|d z;V_9G@YkgFE7ULId6oPAzX}c`@Pq0Vi60K&xx0A6PtQ!`^58I$%pnkG{vQk+lD+w* zcnfW}o_o#NV#du)?1Z0_OjP*!f;2|gytf}D{n+W1Hih>qjkv#@kvjL+>bcf_n)Kto z4_#)S7uYW@SozQv^Xw*A#R6%c7nrh=LeI74x$m-vuCVXzb8W4gU#-cYskU~REw8p# z8Sq?do|j!_p8JNL?~i)EVA+a*&K`>)91 zbyDBj1wDoZ9!ME}S?!ONo&t$zN$-2vf_ys5RA@nu6r!D$2kZx=P%0-WUtMBqOs?Ga zG6_tPrgB8_OLC_0))emcDUqwpt1f?xZccj=LbY5S$C|5{@E9kl^J*kgABTL|iClY! zt3gC~EYG@<+Y?-R=Ut>v;*tn)6=K7CK5=^N?QHAyiO~yU&Xo2>or<3o4=w0Xt_Ob7 zm73%DxvHE7r^VdWIL%I-(Iiodo)h_Fe%sJ8JGXad=Oym*p~$nKM^03pM>!{$TGW}p z4NfB-GX2!ek5)^SQ%}9Bxu1-#OKB)>g;RqZYzb*skV5ah@0$3gnVf2fo8z28{rz-9 zowJ;nIpkc$T@!IF+^fwE&SGaIT4N1SrFmaglfIQNPvx)8!>g5Q(Bk$={9u@q?PNL= zsQLLO4?o&^&3skM)#@yAmbj&-IvBikg55}YI9h}a&N9>1Rs8j%2`8ORKeXLU`l6bg z>v=kXyOY>MNN2Q+XN_(%@0-oLQz&b-a|&Om9!t!3e&<9p3MZ1n>&X`SwuyiGPJN(W zUPxOsHYvfLJcEi$8l8Ll2vmHzcs+E zZG|mAelGsFxhyuhM30<$zx(yjJX30~^`i_FjUpy~F7fN(C~h`s7n4UT zGfDGGBP8gu5TntG#8MT+t5=0jyiv68Rhv`zPFSF8n%MfQ6|L00hJUJinp>jES1ksG z@L{7F|7Pl4Ps_9vm4Z!F`UC@=f)3$?MU*O>Q{&|El+HCXgqd2L@jMGxts<3XxHlqI z+_jMJB3i8xtuv)5wVf-%2bv@55n<{E?)7z@^Cj;7r&~1{WY(w>0kEsda{fJ9@tRzg6ojv(o%G)p~xnAfzj-{^y{hq#HFBl*P`j zPgCP~bE~Wy^++_{8J}Wq#jDGtZq%haGbS;%2~dKiK7?%!whoECbjfbnY~I>7EUR+#n0qm?V6H71*t zIFoY2tB9pOML`_Qnr!zGqW3KYT4(afha%A0tsT|pS#Cj>a?=lai#@Co-Qw=iKm3U*mM$xcf`G}Na~(W5{Lj|HgN^7~ zbe#=pA*c*PLu{`e7;P*lik*epu}06raJk)^|A{ekyz)-%Ql9AkSZw1#+JVDV+9Aw8 zKD->t65_+cH0WVr=jff1<@pF(#_pM-DgMu5#W=7U#oIR>7^Ft;;^N`2>7S~P4rUcQ z)OE77V|b2zHg%d{cn;cQi$0Bo9AWa)fU}>#lWTI<_U=;~`_9`!mTVKraC^GwY6kFb4&FQ4gXo!!{N+GbXep`l}^)TYj%>^ z{pwsa8QiH!&m@{SZ=2Z9iIjZkh zo8A##S0C9^XKxkIDc@q}Xk;1e$+OP%v;u~u8SL((fv>G3g*_2nNbhO4zsxy2?pg36 z#!fj}{<_X1ZB3F{v2@;APbnJV7T`nY`c1qSKk8ukTROErSRSXvLeVt-=e^4i4vVfq zUbna*pQhcG(u^)OH({w^jPmI?S;9`yWp?GCg}J(is?>O6JnK`?cAuV4vj4U3)6kxl zfA?8aEFNzunmYEddMwW(UY{MxqKvID}9UEgXI&>E$;!(+bH z&Q+_JUAsKl9N|#OG1>fLrII4^8-vu+siZC?2YoHM9xL-;<(srxiSq7_q|_6)@m^e`gUQdTX9}>4p&rR?)D`jZLk-t4H!ivOk3f(DumsS-8?_y4Z|E zgZZl(Tlz>RY44zAjQOOUt!Aw#LCxTJZPZ>hlBV<^rGWYB(UnCJJ#XVJHL3V;?bEyT zhh#{XN6}@GCD}38NOqrk?M@k^-~~@GknT}w>U%4}Wy@3>g$qS<+1-A)mM!3**!kPF z9r5YQ=>GMv|EY2Ei`*Z4+CJ%vCx^L|QEKq8JU>`G?uQ;#ORHV{JPUZJHZkfC!Cx5P z4+MWIZKMRQu&3gyjJ#xc)+=7VJ1kVTnB3)2MOa-t6s;8Yol^EQGI>@G)zaoZBdgnJ z)*4B_3df4$qTPy3A&(xy0NTey<~4wGeU)KHQLwEN20?RcbhVyDw`wr8*KWp>!;S2Z z6t`ZHvZ%537>tCXzF$Glsc#~CY*46Y#AgnEgS$X+tlk z*!+{f4{yXY2AWaI=LCAFH{aR)Umqm)v^UVsp)cRt9fEqIkJ-ma60sUhJH4?h>mu^7 za<;bpL)fF%k%!u2At3T?A2a@%5vv(pg|(!z(x81qqpf=N4b@jqNbQ@EUrfn*cJO>N zjq{i?yq%m&AIqzb=K;m@m2xhyYWK&(BGN{C-Z>YDlCKf@Xqig8!g-dG^XcU6a71*Fe1Go%)^rCRU|rF4!`Ahw9)1>Qx(! zxS&w7?UI_+se+ZBJ%aix-(|ej9$x$c$*YS0Sju0)MokD0x0n%%%_C7-`LSu_pOp%h zbicQY9@^#2LP}mlEf!N3kNa>0qoK4_k(S0|CmlXvwqa#cXOCo?=EPI}>E<(%l7 z{*1fbk4tLV_K7qxRNe~86V_;k;tj`4>(Ylq@GYd-C(7E+K4CJA_6kjh*aK}bC{#a5q%MF)Kc8u@Zcz3nn5vXYRxzcr}U4=-Gi2a zF{!=ykulJ)%8Y_nu137oK(A;&J9oSr&PW8Qdo8nP#n(rEZ%su+rX$d%E^|Q92MWS{QhR8 z7X}n2uo%7{-&7fSd(lUNk^YR2xNmA0xo@meH%CS1b&6#c-4OGK`y|A**Yj zjyQ;M7!ZNs!!7S05nD-3wW>$Pd9CehN)!fOOgkb+Aqee#0x{wBLljRn>yxNOZ`Bi| zdFxB$i1ZKjr-cEnUy-?IncSmCG%{cHxoRB=K?9;jGu(nRslCQV^jKsWnWhZEnDFf~ zaGR(t+ZTdZyQ=o3B;jvqY%~LFww1k2S(-n6p((D~Y=z+Cwu;{c5=xqWdhA3xY-236E($Xy%EsP~T~P zEgDwwmd;%6i~(}g!sWzyyQ%Pw&*PbRUnw_@kY z)Li;%CsVF;2_xy2NKEW;1w`v87t5cqyARC*+sDav2rVl;% z?aMq9ezzloT@ynMi(ZoEm_~gy_m%XTW|c=pSK@VWC6I6R$ix${E9@M;5G2|Yi&K~_ zcJ!B+dTIwKO{Y9gWGY>_6buTIBjMhj!H939St1HqknimqM;Poc2#w?}ioOtL4?}e% zlzaz2pO&9^dZ;`vKYb&rAbbYo!MK$cuv&3;{%9mUO2KNi*>&2^u`vFa6G}CkTB&dC z>aRYu6mwUuq}7zu%oOc>zR`cvIxE~F81d$Icuse}yb9C*VYpTvl4h{|YH6Hs$&oyR zQy67$th!%b*O|1xK34w=$E^zC;K;sip*J>usxj28kDj5HUu@@@$9+7>^oivgdN^=; z)R!gHPqXf`9M=OYvHK&LYxvt?-kgOvZxzr82qHY{%)|G#y@Fq11MPL~Y7>S-?<~6O zsGkDvnqy|V#cp0%nqh)-y8;Lo3BE;V*?Ap_8>f)AnN?eu)UJ7={=GFUdgfZpp;XGz zu30C7n=BtlGf!AS>r1#Sm1x%-4o4IzZwAH7r7LcZ)h~~(NeeCaa84u* zBuYbNMW+_c;?+?jE2t7r%;URw^SFh0;a?9*!|e=)s2A-TwcdF=A>kn5Vhf+KddJEk zlKUncqf)(Hs)uDQO(wpG<)O41s#89Nr?YNPA}rxxsa z2e7gb+R55fefUbgfhQmx6TZ)3L@H>pcw8zsk{SuOLp&{UIMiEq?pThmN)-%Nv!@$N z8gI7ke0gvG?+uQU56%_~cbdUH^1KL*$nge@YaXdtZ~ z>UUZ7Q0Q5*u++ccFibtRuva>rG-HVM_%x@`3*ytp_JgQ$N!e)rsuYc;U8O9iPIIqo ziv2_LbQjl%!y1kC?P-VRd)Km$1X4XXS17)Z=8~|KFp#Wi=sR&q1^b#`=W{wYlXsTC z89p_)eIC055)=!j; zt*;=))+$_fxX#{e7aXh3>Vs1#p^W~uJNfXwTzwVB1lCT)c+z_3;o+9pcc&PBmN1s! zTUb>yx|X>vXqm0+T+D&4Y53rVysQh;Yl@8PJ*AkJ!HTQj5Q}jCM9L7UH@tBrKzzix@xA4t7oLV^Y}FR{XWajF(O%byrF% zeWSUf(=^RO)u)`lf`pzXt>c~qXiXRGpk8f(PSJOoRTiHM`wEvur|LsX?R;;c-J)z- zDML6=T%75A8@WFdgfuaiHDcj)wW~x({B(i^(Mf_k(Gcnhm82)(GQpDVLG_jDEy%Li z+_u9?TqeO2)O^z_Ck&w8^zhk0Q|HK4#&VjH%#72@E;w6m##FpW%`m}KBYioG^Uc1b z^LnhFoX61Xg3~4gBa^6?V4@ZN=MjwC3Z5sJF|jK|^jfUi*|kM)k20mG=d_+^_KUBt z7F#Zk@Q!vW>Q{}SH)AIn9+J{GnYM`r6*a8B3v)*-ooGkiLZa<4yY~@a!>%97$6N8d zItvb$Ls2MR{HoZpvfMsVtyO>V?}bP0eD?ZUqpN-tl$BD`@LF%%rEm1D);Zk^{_D+{ z+g+@k#p9T1vDiPht!kNF)da1ACdvG$r7FqBc{>hUPQ0sEXmKAV<@X=Ok8c;6k- zjXafJGfdEQ5<8Wyw!!Qu3vYyT_G%=oZ+8)Di$@GGSM`m^TH6N*0wSi!x&@#If<6EJFt^u##Eyyh_(=}GBsY_%vH|` zTUh?R>LNb3w+=_1UmZuj(KK9`))cfWf6cyVsE%&&XjTkiMGNsd=LmCZqw$j9&r&R2 zT1)ABWgZ>VO3@waP0cW2G;e;3>n2R4c1|%ZT@EB!{29g-Va)9}=Ms^9U@_z@aus!B zWhrcrDQ=ou?x>hN1?5^VEN0w*ldowgl z8EMW458FQNUi!lf1VvJ4iSr)Z1;>YLBzzJ{9mMC12zqq#<3YZi-GWi!qS0pG5Gi+M zVZhs|3QjGpDT+o|)q_ZVtv&2127*t*HmNvh(cDElC%W#^J?K~8YTcU^H8-Q-Ot?;# z{X|g+%eQcXW!tUQR3p-LXJTiB#WZ$Bws?3k^zw9S8MzLJ`%{o+`^q8L@ERx@ERtIg zi%Ucm*jcUG*j@ce)G{&$o5JFsNIbOvZxiFB_}`u!)0^5$2tV3goIT?awy@)=b_wUH z6mc}7Q)`x4`d~SjHF7oes0QylVKMLWB)(F>_u=m?4??nQD%qpt4>MekX!%t;&%6>Q z7&sLT8Q-?4aJc$4l2Wm&i?`ApW_Ep%Fl4cAJl@3-rWHCp72iWV5O0kWoQMunZ`u`A z&^?;owyTUF*^^fDz6ryjoe6f%s3zK7*tmMWQa|gYSLewZ1C5E+EKyvm42;_rY0g^d zAI&sN{isGZuhFLNku}x~6&(CiBB)Y!vJ;r_JLqvo;3BFv{xyyuD>jmWQ0jw-{BVdVSn<=*wX5ixBJ^FhNnI<~zd z&0bHdlWgTnJRekC||Gqu65L&*=xHf3NJ66By_d5-8Hr4 zZh08N!+c#^*Y!(bUU4nEO0aZI>zyNb`5#z2j_lIcVO;6u?Dcq9u47CLvb5C24BtMFb?I7Q=<1a?!Ows0@Gtp0F!GzT?CUR*!YEHUf67t@!SWWTr4aIyq% zDHEH^k#TWJH0MHVn{Y#zmw6OBdCM&m%-NRMoqD+SVJxaQc6C28rbp~<(Vo{?yd}u? zFq-hLo{w-TO1(xwiH@p^!8VS>1`=b!G=4l;P4`>C^SdFEnlIIlPokY_ z1<{t;3a|YKUPH-d&M=TEUa{^(BlV@G;yH?2(Hc6pP@9&sqG}aRVvOuuu+RO>{!e>L zFNGvn1u5Z}UcijzKrePK!mHwRYc}_CXR)3&bMgITTBr2tNu6idxuf|jsX2XZ=PnK* zNL@p%l&g3eI?E95v(M)f+V`al)HFhz1)`ca$8_eQ5Mm{8RRFvr*f4Ptu04d zLpG+5TcTiBd_9$_U5;0>gYM-lv)>NeEBD~t(#~3Cw2x4ahEIL8`Y9)sE-J#(E@2!S zmTeFO*!kS`t*?tuf>_(>zAhMD#Z{$JuQg?y9>3uZS|e<_v9D$ zRo{`O^w_d2RuUIa=iwga6UGuXZFRhSE|#&QCXA=~YEL~+0E#6wF$ws!c-Hc_b>isl zZHjrj$jl=vODi6h=uOQGuVuQ|+EL9vVKSTY1p39U7OIhWTbkX%s2&~U(X$?m#miwN z^CXgE6Rw%QwlXnV!7Wu$%}!p@7Q(C^?zQVdctsN?pGB@(9W<{s`d&*S$4E0)bHH)W zL)5}(_zcqGjQ{2I8a1A4|9=l#^XS z_BD$|>v*tY+akL6d?4UV)3V4JpD69VR{zMI{ILg^r+Ppq7@nlSvE82ec2DAAG4Vcx z)4I~5u`}DFm&0&uwPBP_Gem3Q=}>0n{Im3QG)|1gHeGH0?7u|IXVEHey~Ld4Lhg8I z3%mAN+9ft859>vKpJ~>3kA@Mo7slP;{mrSLBIj5-MK!co)5?u#&WY~(bT#+pfpYQo z&pPLiyTi7U#plXf_<-|Ls*f-O}ElPvAs6fz@{h$^?5xf`6ZO6Gp$x+ zcq)jsqonm!up;cG(X^|2q&57paVZH~e|-_VR@*mrh1ZH6USIV_Yi$Z`i?1D7M!i(u zX2Y>k7`sB+T1LXJ-N~vZ9uLIAvd2ja%UH&)#*TAbh_dkTpf`)P-;69p`A5zx`%b%o zvE9yN-!m|2U5vSps-2d}+qQ`glrw(mUZ$SY4+$c}($ ztL}dvZb9VtgQ2$~*CVw^6ruJtk{msi_mOx{^QjuTR9sF=F?!<|=3{i-J$RftZ-+fB z&Z=SYpP<}JE$O3hIhud=d`9zGZI|SZ=F<@&D$GhcpHKbm7%7d$%B}=nzS6oBk5Alp z(V05k?8;Ho{!YE2`MZdef=es4WM#_sg?SxkOyR8HFD}X1vU~L8UPpX8Z*339XZ-Zu z3eDPMQq$tH>bh3PcT&lcnnlaXTezKDd45w3e)KM$bAHS823|V9=B~A7x#P>KTvD@K z?|Kq5x3#Xm#qn*PzPxI2&9wR^XXI(~>KdvWR}uLg-j_5sD7!I)t<8-}dicz$)+LUw zWzwS7x|KEaosof=H7zZCO^!dF(%8J5G=G`XTFv{07H8zxIZNtiEnMo1e0y$l{mjM& zXJj!2OmC=Zbw)lkyJqp6)@EnqxH(H|>gy*}Om{}6mNYJ3UeelJ@A%H*om;;xCG~Yp z3!AGQ->*%LDC6X*%~efH>K1VuB%ivL*5>ma->BJ@#7=Bi5$(XThi~QFJD|vW{z)TX;`pj*tQ%dXM%%Af&a7!zLCTW3t4)79zCLr#Z&*ZE5P7+}v!R*0O%=^`4XriY zj+{ro%xP+Dtfx!W2^8x1)=#OgYMnFL@y(uAQ%}WPYx(H*nJemB>r7|R^op$ioWx>Fu0RAK<1k;W96A8z7HnXa!4u~bj&WB%2UeVf0V*yA$pzhrLMbPhla9Jh5OeZ-bzd5^Z(GrWJ z=1*;|t0v*CGpkzYx-125u~f@;fRZ@Ar)I1yTkWR)j_x&SEDl;pqbw5h-8f^Vo953- z6P}CfBl^wpjnhjPJ0;Cnsk@5$szo5e2Bx|bJs4&Ny~IRmsAh~7O>1nVrYq>_vXus1 z^r3i~W*gMNw{?q_2}T{?9WrnuEzg{d~-q_&I$m%IGDW{O_xy>g!rTeU9(n8u+T#6)mRN*Hmm60v}hU z+#3DDcDzaUzzh$?_5|2N_?T6wq@rrkGR9CSpm}*!E6B}pcF=JwlH6BRHMdZzQ#P}) zx~9HGpx`)5r`9yoG@G>Ea%NxrY*O{gs)j{1)w7!Pv77vPy;NV@HNtT+Pitsg)lgZr z*iA6j&Cl&{=e;mWb8fAyYF=E^>U~-~v#PGa7Uon|Oi3G7S=+okrqrQbqk5Ou)VB8e zm(#1Vv8mTJ&cMly&Gi4A*7NIYlKL%dvAHLeRGDh`^?4ck8*MuVv7!R|(`xD#FKO)+ z>@muT-yrt$-w zA+zeMOPXtd)>&#&zkU^sEoS7Bd`*pBXO&R-n&!b3b*mY}3IX1tB|R4mP?>INgPp#W zXYgh)|ahrsy98>(`P#DHm8qm>WUtH-SiXsOlQXcOVqUZ$DYFdN&Z?<9sbrv{~|Cq_k_*O zHH%v7&p*XqQD4KX_d{gWEux8jD%iNn-@2qGA{)1iYX8FX{WVpKmiSlNHQL`;YbsOK z;;&NP%d7k?HBD8(ZA~?wx3nrj1Kr!wZyw+<4+^P2?z+R>KufYByWs`58+sn)^}^s# z+j}cp?k&jES%&c14 z*nIkm%)%(!>0aJ8H3 z%&rw4;(p|hsp=5&o4lf~zPd|pz1qAXDeRivAoEQqv!u$&b*;?qJ_{GN&RS;ru-8o% zouu|~D|N>I*WR~B#Z{#He%%dp(>(Li#N(qePhx_>Xq2d41hkDiJ1V00eLtl0S0`J3crcr6HO@Lwm(65f<>_qQlEb~7y(o#OfWsR8&%b2} zgmF2qXCw5=e8##Bfhg5X^e4L#LcDzCV=$;?d`N} z+cxUx=%DS}w^L_lCv|mo(T*KE=%I%mqMbW;(ym>*C}npFnVv9F!m$KOJeEjP_D!Lw zd#BROJu_+6;aPND&vkU&(d)=|!bTY2FV`na5|+)hDi| zS#QmvY41#uL7U*);csxis(jd9?5ed{gAvY+Cs2Lb~y( z8)@;=i)qm_izufzhi>e>k+NUNrW>BSftEbIgqA#q@ca_WeJ+=lKEIT1c>!nn_AR4Z z`);M%`fj7;FD<9rkKRsq9J_<=Ja#ADb?h#h^Y$Fd8qA`+SMuntm+zw6-nfkljulY; zE0D#@IGg_X3MzQDfC`TnQqhSbD(uJgwIa$tl}~rSaW@qoFQ(#?kkv`-ihd0{iBFc& z>i*SKb^_k~euUS`sQfj|^S_4g37#sawXd$Fs#mM1>Qog~zg|r>r)sF?^%`3L=6bsK z&3mc#&04B`tCsE?xQ{lT-bkAUHqoZHH__(Po5}e$ywqpv$aMyugR}4*yaNy1JB`%% zF80j42M^tQP1HQtOrH1QW&Hqh{!S}x`xtWlxPx|`*+re7bkc*t2Wj{2-Lz-V9@@Ki zFYVj6kGi|NY5)HHbl|`Ndiddo>5)esp+_Hmlnxy_L_Iw{bolULdhD^s=<&xNrz1y> z&=XHQK~FyUBt7-iQ`FnrOHV)jG(GdoGxY4U&(ibHKTj{b@B+Q~;)`_j=utX$>=^C; zU_U+j@uT$e%P-R_ue?IXj~}Q0{(gG()mQ2C>C^PlM<3DdbGxZ$2xSc&rk8&45}g=1 zL1(`>OYi;uJ^J+1PwBJIKBLb+|D1mP`!DHV|Lx!D!i5W{fPdMa=_}J{YKRg>zxoPS z)2Qhy;4^*nC#K}IwDc6a&6<>8esgqm_=>9%t|r?xSO3GTnKOPoiZqVU-7D|C|A9@; z_2sLJ@4Ayhp=;;N&(6+XxNzZu`E#zD9ujF*Y}yKQ?{}eZS67yN%MuFB&c1Q!(xrb0 zEnSk6J?Ba#&AR5!y$?MY3WeILN{bRhp?OPgU7nYR=UZ-CG;fxYX4CeE4?VJTHzL=T zt-2!=%3gN*%-gpw$8+xD`By7xwj6l;NKf~!c0^XJ$q$8cPQUZ++0%Kq;(76cYdMW2 z)Ov*MAxbJN2!(Eb7k8Eg*YOLy>3T-IxhFFey7dEolkE_19HB$U`g#xVX>9_W4fjn6 zh0c8UllRZ&-FzdS7i4ECWgmI<#Pd%a+=i&yx{cF9p?81y>4)#$ehVjAn0>vH=7oV% zN1uKSQH}2U%~M06kA6NBeE%$-7vFG$Ow<3{e|+tg7k?jmcwdLdl@SX4;8(x+(YcSm z44q!SEO()x!4Z06f=<{Fy>SsgW|6cIJ!86OU6<&;f@%r&+ zpFFhxz>YvmL(NY|NB{WQx$nGp=JwOK-Ez|nbAJi>8OYs~jGj<*EPgY3io_ZonpxfT zfv~-En=t#nkY?W+&Fq^I?wru6L}XQs9VP3ZCe5mqnu<~*Egj2qqEj`eDt#(UcG;=w zinhq2XCVIs7LEk8U@}1HKouJFfTHXf325bHfD$F3Okfmiy+|0FCxd}rT|p+DWf5hu zNC-P7gJ5M9CowKc<#CZ5cctj=71QM^laO$t=^`VcYu0(4buh_co!7fDglK8nibYN7{uJP9Cf|m~C5>Ka&%{2Qt;LP#59ShLMW{W^@f(hcF=9Atp!$ zgQF(D7*j1b7}lhK3?5wbs8Uae90)9vwJkid(Pz=@e>T!rx?LU~O<|y4;@1OHYl``v zSYXqb74_kajwb(d4JcdcI-q)x8x%&H?~Vl-l}m%h5>tkcdO!hHVjpPjN|@65(W6b4 zfI1iz`mPK=fv~}7z}zWn)LU{$u})%ojn3q6zFd=^t9RVwkDL5)lRs|qb6YUk&%pGH zoBVN;AI5ib4Q34Le3+cDx?1YkGp}@!8$=iOu(aKu(E7+3cAk)su43I7Ac0-TNr}QJ zNfVP6IqI~WNsUcPQcRVk6rG`>s4e^NGuTdr`(Mr@q(?pqyey@PwfbG@w=Z#Fu$f}7 zYg*IfZEArJns1%k#jQ*;k#B!mc<#ah*RPn1kF;Y`Bi;LJ|Dtv*CIQ+oA;t3)DGh#1 z{B%}$VR=sM^`Fw}tLVV&4Chna{z(Mgzwt4)By-Q@ECMz+lkp&0)xZ5y4VQ%;#& zk~`B{;l;#>tJ!K7UQ}@(cX7sDoN*Ut+{HPWC39)-;`UD5#i_csV_ckT+%3M87I%v@ zGZcF#K{#;|RF^=BbmCaPB3qT)SzqDxbSB%YU0CA5Ydri`yWbCQV*pdp9-R#&w3BU_ zG`3~5r46b22gQy_5_XKa`65oYD+CP8owv$GH;w?-N<>;IFGgA^E6slsix3Qq56k~k zrdhYiX;z(QT0s3g~5X%Uucy90VaatMEo3fbZGcCzt-HHBD~jx}=vPq{EI4bv)cL$n3ho1jkn zD9GQh+EI^dZlmzj%8Wba&YkP1uF0>eaTHZlVL2n7zopI9@Ep^MTPm@9zflj;(k(p> zMRGPJ4AMTAbCl(;s-COC;b|!eXC1qC6uaw}iUpxT3&cXZf+wbU0^Ffs;n?Q%w7YXO z$O6M|~Qc)h}ica=`|4dwaPS~mYr8x@?@I2E;NFxh2DCek<`oGEN2iq zWAU9PG^wzBrK6~%tk6J@7+$n$dQ{ciYk;c`V60*?Qvt9_S;iWH!J=mfOj(gHBH?Lw zdwKJbR(+JEvSNj`fo$Xwn#pBz-{r|htG6bT9Td+0OmcpX z5$AceNtp9f^gv?SFF{$R8?gWODrHzLmW$7Co6k!q=GV{1qJ&mAR+*#2Q`;&oQr<_m zTj5SHy5*A9_kcl56VVCAHeM`E(X$%0Hd2_c7{HyW>s*c78&>sbhQB8nzQ~B-HTPCV zsXFJ6<+X%jDKp@8K?JX>)|D&VMu$_f3in@&<=g@Do*drVrtjOd)z__ zQ=+f6V&#eoCzc!u&5)dxTyxjetU#+Ox4$^*0ZM6xfR|XQznn_m?o6w zVhZfeN_9_%ww&e460}D3Zijp!Ek$K3LW#HDz1?h*W+RJ_6Go9M*ZG+*p}l3vNf0r# zN+=_8wIVN2g%KI)QXR*N8UzCqi#jxF2_ffJq9eAGFLJ@zkFpR4Ohm3jbT5w^QfkG zxM~=g-n>IyS(3^1RO36MJlLCts)B830VEN0hc}!dmUp3feBK;K3HF`AN@vDkt)_FE zv&qA&Y!``qB8{Wo=k|N&2ZRCdYY()x2aK#KmW`|&!m83Y8+WL>X|TBo6%93j@ednS zyjv^+Rt$&CDnv_;L2dh1HFE>qUbqe~a=^}WFjLxGSjV~ujYu1I-Fe)+krn2xqrDYd zx*hy3JkaJ2jjKo{OyKC+rViuG&9R!BE`(p1UsD`eteh1;g^S?HI0G z(^+ES=i~}6V6MbgXe)O9V(L(N_?qi=Qfk7x!>wEWt-Rk*5!fS&z|V|vkR!?2HRK+)`I#$inp=9}=rb~68Ml5}sRse&svCY@+ ztSUL6Kkz&XsLmHG*$O!ngvlEjKBo!X?U@v7#eRCw3;+VPbHR;f(&ofZSRq=8GQN$N)ntXo}mT+Q|3 zk*!f!!Z)kZNpyPPVAi%bBr9SntjD)(Qb>6y@nT$LC^KwjMbZ2n2u!5gwg&3N2Vaze zQ-teVs@6YAy)a)9R*Q0c&;uKC`2!m2BE%Uf%A;rq%y(;TQlbJ_Wq6Bd#!`9to9gBE z>-lTrJ>T5(+7t!S;m5bCyHCMSy8GS;xJZ1OY2dag2PW|Mc=>mCiO+PO{bo30cxAqmS0Sp4$q04vBm);L}lG%YM>6E(hwW}efW}vp6GOd z<~Cg&!YW0qi9|OYwCmDbD%K3T9HXKL(DkvPb!jdYbP7P{*XzCJU6F88fU->Rb%3f% zV-+2+JgIaani4QnnPM`ivh}y4^;f?GA{cA=z5-Czq#uN9lD^4Ls@ulZU8`JH6~-mj zo^V~^adq_;XRABSzoi(C3Oz1nl{U3M)1jg^IyR>VjV&rpNTDZUXX^m1jL>~; zE@y_S=jks0N_-@V8-LNw7%$llcPeQTy69EJrY6y|G6 zQUd1)^WLO&T~qYX)RH0$1kR}F$04N@=|b((87$FK(JPFRjbMqe5&F!+Mo`7WBaD^8 z+w1na@EsDR){6~&;R(lLNn%>EFiu*a3fA<1Q_QZGw)+E34V_wF7;c7A^?)N3f;}=3 zMHNen=^GZ6C?INOM9yX?+Y{yYLcU=M2|WJN3NV~sRLYSqoo`r9if*D&D~>%baw=CZ zp&x!7wnf``x@qy)&)1~rrhg;Rh?w_P6y?kRP&DKmuZ9Loch$O*l?o@68I!jp3T2m| zt6z%~scNU?;3DO&WGjrC@PPb&(H6<|3P-fD>x}4vBG)BQxQQSe#ztG5UMy=!Q$Z__ zvcPo2>NG7Osxl($RCHA!FxuxYbfPf1Aqr1zO|Wa_J)}-M~)m<-_Wb z0Qb85$XU9-H4sz2=o~Ela)6>CU`|L{(cb3A_qS}Ww)Fx;#E1nw(Hh@2cfEC5BvcWp z42i-Y(z9*#H|l6s%6vVhOv?``x<|6XLRf)uVZfY_p?=o~G0N~{L8cm01tVO1L(Dui zxd}z|FpY4r4`3ko(Hl@)AkQfNW{4T-6gbdwp7Dc~N5nw&quqZHVrcEe?T@S?!n2PHB;Z&4DO8Ktm=2 z;2b)5VVsgQoUVu|RYfcO0h+LJq;!<0F0-SwhC9kMe2#^|%T7{CCIeW>@vv6B6pbuD zESfMYCKHVW7-oY_W5e{Q0#zo2ck`yoZN1vOndM)UEho}Y({1TB9yMzE6D6+*FK8IK zWDU8g`m(Ft9;_OT-VmHA&C05F?_!>+NSY>NpaAgbDv?$-GRaydJ{8%SWW@(l8}Ypp zb}h5Jo84`~!?#s&@Wpz}RN`zc{)&c%CYO6Mw_K+1x2?fvMw`4j+=H1-8Tu&HG_z@n zK1K`z&8DgPIOY3(W|IPqebYH=w?zsx5vAAzq}1YnRVodR@~UBKc)V_H@wRhUtW}T1 zdHfiaf_;9{HK)4y*lnN(!rnTWM0)S^X);mJN=PYyg~j6guQG8mygbSaeR6a8O&Ut3 z#riiX03>})5{BOYq)(fUv`}!hM87_{)O&q$bNSK<3S~BN2QDF4fiyouKf-KCL!xr$ zwx&k$i5d-3%Dix-F7;HT7SlU$phvMJ$^)n`gDKK^@FYH*Ll+%^7URAilSmpuiSzhT zhYAB_6=z3powH33R2QvBgGq&-7d8OODKfiRh)=9mBQ`#RC>T| zW!Z5C^_l%*3cg$}SF4H375;Nk?iGByga0YzwknlOU#6Ko@oj+>?Ey>m-BIOpMzwtO zL+e_3m6LYHypT=Yp{1H9}ULTus0m3$1fp_Uxgk&MgwqS z*b`Mt!syt;^-WWhDf47qllUkYW=2QrF(Mt8W&jJFS3ZVW(<9$U^DL@@PL6CEIJh03 z?owo^AeyR=(j#e#LQ>ZZ7$T{AAB`l}U)F?tk0*>^q^>6m6`O~377AK3#WNm-?m^$N z0HcA&@Ol(2VcpTU)Dx9qpNIBcfua-=e%`@vSbszr?7`+m1qRBVq~pp|kR^MJ7%kFI zGE9Wf)OoVEkVW|w#0p~KcgPrgU^}8o&fd zxG@BM8qnx;g&TGtvbFon-BaEMW-Uu#h;^VYR0 zTCkWsJ6Kz^LtI(xSXU2o6ic(jeu?&0UV9`~zW|QDV(1%~R8eRQnyjDeTB9-Ku7T%W zE`np?JWixwnJciX$MZyZ^1F#J)weRNaSS&GS8l2KMKrcy6EBQ!WV4bnPcZ>y{n9B1 z%Sm~uX$R)^g(b`#dU(=W>AlaXy>}8mpWWhYwa>%)kdiW!$%gZ56Y$mQO#V9Vg$tSD zKmHZ0!FSNbkFWfxySovVAehL3|M>Ak{1@jyoC9$V#5oY>K%4_{4#YVS=RlkTaSp^e z5a&Rg191*~0}jCXAWrJ}x>s4$z+ez3QFW6ar%`p|B%;2)e(E0>pn-uw8pOL`aEO9K z!!$I^VMGfuKVSLXFy6_Z@;odagM))KG!ztRID+3r|GKJ5sShV;g@X(C#-TYcPs`3U zclVBxEq9PIbAvQ9kHet2X5yaXY`H@sPPDVg%Ec*Z1>kj6 zL7w1;3-aNUss@0+*pG8so08&<;*T^J1_09Otp%!mFM`UUM(W02t(6}ZMA+i@Bj57&v&u?ytyJx`gX zgs3p#`2f_A2#bs(#6M9`n<>Z4k&4?3Oc>+(bX zOuG!mdSFCQ(OmbfCGLY<|ce`hX+YD64BA zg8u$)&_6y#7tSM0!h`c8gVf`Slt1fzDd-&se!-#h;+~(GJ`PNOR@FES4qYIw3!**9 z)6oxI$%PJ#us%!@`oNn4@TmZ8B%gN3?EwFz?(;p@{o3G&puGU{?;RNz?O-V%pbh=E zK`%rd7#NDk*WcZx(hnIz^R7ehebaEOk+BDf%n)lk(R!(1kiZK>fj9w4pZ2>gg6bpr@bP zfSCw==o|DrV;BQHp#MD6E`zZiaGwxOKkI(2U!hH-A90%eLA#!Q(I=p9gLl3wBf0n4bzp&}V{n4q3rm!IRR#0_yInMQDb8DD6cw?F?hEPtwnI z7Cea1163E$KeGJ$nj`g}>1~E?_YNp+KkGm#=x4p)x{(X{^Lrt0^am02LzXP#K7-H& zI!n1Oqt4q3&?okw{p-4bein5gZvganQEw2k@5>UjmyR`4)krh))GGQgkcBhjGev#q z>32o6cTBUM55WlfRUT-3Q0X6rZ8QMeG^+mBLiXI}bAKoMKbEy0G&9|N&$Kgtm=}8b zS^rtr_4E%x)~pj!_x+H2)c|ZIw4a%<4QxGtk>{tIUSK4gGSFZ;_v=76*ehNaDdTS%?Kc=y#AN@CY z!2Lbb$#p@20sRFn+&6~xf!jYt|AVmEOZ$dsU`(m+T<2Z=LsZq(OQk*iuvG@ZFW3v{ zLkN7xMLR)#u%%#gmbzfa!tNb_jmA81Aq=5@vW=MAlSeaE`TGZJX>b_*9)5b7MTGj# znEtRH4E3UY4EkxPyOe_cy;@eO(|w?sc_8(GdBSZ12iA`&ztSf#4_N+^eg-sve%z0C zpsE+L#I?I0;~rt>E90IZ>TOmjXhs`rgZ)5NXk$Qo59~PpF-@%ZuCZ>7{=D7-nAq89 z2eYB~3hkU$+6k-!dR`2({Kv;dA0V!Lk1!6KV0>(hg#7!!U+BMnoW=ADU5DJcf8%~Y z(#q{32O)P|TabmZLQfy;Eac^1cuXh9c#-2ge&5_Z2K|B!2m7%Z{kXrI?cA{a!#coq zAvoBNcA*x$@l!AQ1u1u>9G$(Wv;Fv8u(z3lpf3nH%P@%hLBJX80W8=&Lj!%BH0CGu z{Oew009_;^h<>Z54|O5xr=BoBwioFa$aG!&fj^TTA^o={tz$5!7ulzD2vy54)!iw&DQZ55k`k{bL%& zK-2lbF1j$-tpwN;7lJ)>0Vg$cI6vGg!Wga`M)96`!1^+2eig=K`57PfQ#9x1Qa8qS z-MIGS)My!4m*stTRu+lC=@9rQ+9S|7%ws}~34-t;je-Yk%Z;P`V!Hd0Hi+v0-VFjC zx2N(q4*O7}U8PsjeF3zJFw%$de;<4!eUP`p1J(nsD;Ld=^cN<{&v*>@T{Hw4a$vgp z(0>hro)PeY+Z3jQf0BNgj^p(74>El$XXIxcU>-0WNq-;wDa;4vf&7ibo)dD{LYR`WSccLh|5Z^bbM*hv6?A1|Npd77Q^zKyQ$B3$R%Jf`0Wnh;fmE zzX9#c14;h~7SXir9TVHhx&?tTOMFR=Wj>={3%n}g7QRsJ##S8mHVy`(>!U(L(BlKvB>nQ52L z>|53Hqi+HKqUo3Iz{Rfm_K)SuHX7G=qrmN?ZO!Mak_R+@<7tg`m4&GuWU03{lCoo(eh{d zCz5>x{jihx$Nm4HTK_q(Q5a$VLGLBq+_rK((Da{aKM!5jcmRIr+Iy`&3mzzZVEWnq z6a2f3{L%C?jcgA}`OE8s@`ruE_RJ8|2)agL_pr|E!zji*!+6hu>5id)9CTd3{0?6w z4_GH;n;@>x6t|D2zHLy*M)=4IGcVB62AEnxcD z?g>KgrTouxThFv=wCm|sX=b`L+Lijx<0T%$U2cBHo$Wtv&zUwU?+LF+!)aMZjDA87 zAmcH}+^8?)IMxSAKf^db%JY5P4sbv_!&kNonBC;9lzujd#%;QtAM%l(shHu|UAR+6IojH0r!W4L5cZxx%vN+yyrz&-QC?{ zGa7H!jt;!BAv*BJH9r<^Gu@Y)|8i;P1$VVrNX47&yRhhrpBX2{jTag52J9*>U_yUhGdKf}w#LdgOw{N@h_$c-d?)o(1x#$tO8 zoQ{Lc%d(JxWyyH*0y18t$8>XAzVbVU$M5Bj@t1TPE`cg9)DQu5$p^mBSCW0no$A5A|$Gyf!i8Andb zcuRT9D=$vvvZLwe_sm1iGf{qy=e!(P4*V?P=<^%V&v3auFpkU%PS0>IMnChBWzRfd zUEr&pUY0*U%PZGmiNB;-e>I|?-!p!Um!5uoK0WPv9x(mU`6r^E>EJTtmGezRKkGE7 z<+@-L7>1tiX!@BBJ^m6$Nx%Lbr;VmxpPy-Do#()EXZqzc(;A&Wnts_1TEFZT%Q;g*B8D1>+{QdPN(Oeq&qr)H2ty;Pjr=hF{0mS zF*W1BWisuuK5&1?d|>)H592I#lkbi6mt`n%*VAv5pJ8xXNxwcH=hf%e)6e)xeVORW zX_yD!gnn5Mn07t=OuGzHetI56)2_##>6dx+Jp88gb6Ju{e3iW8EA!;fLBHgKlt1Im z^m5SCz_c+wQl5Ier2b3#ziIwx`Ez*_$zD%C+e!T6`p^2ny2g2p0^`m4FX@(7Nk8Mx zbV&N8Jf$v3`lT!wo}T{8$sbKW)5tXGdCm6|$)9m!TsRHW#kepp^nvM-xU=3z(=X*L zd2lg4a9PYdzH*++$sbL>l)qjF^!L&F&-wYsxUh_wA5tC?H+khWOh5BW)_>-cOs}U~ zFZ*cuvwZZtzMTAwJKHVN-eVjm3rs(!WgLutk`IiNQD4Y$tPhfYhQU0LJc_u)eQCs4hVjU_X2 zhG0RPufy*y^0gKDJoWCjl}%2MuQ7RRU4!x*K8M#=UxA|vS2nfb2pJqUHp?dtMXv7j zGgT7sST|_ zsAUDtns>L^6<~bwZc<65$L;jHaT-j06HYI4JL=pXUxzrurd}fE=-A?Jfy@9}ZQdS&yBa`K?%2sk#iCO>>8TH!Vn?N4^Pw<&i?6<$8h3`dX27=Bb> zDCe>X7%4S;BB4TOim%=yPj|Ab#~v4ggv5n8txkUuPHF>fNja5HzssqfP32f1-evC) zmmN6nNi#MY zn^g8ovADt~Bqrf(zIClDlk&xRd{*V0C4B-u;g3%c(vrx7j=-RFFo?Ca8nwdN=(cTb z@bj(P4t-MNthTMr?IJQg9LZuyvbHwzvC{WX6L0HrzGtgHM>&SuZ%RtT`Qv<;P>wh* zGwF(`(}C54HAOOpq9)^0m|4bt`Th!>D(2`kXsWBFZjGRCCBHU7TX_Y-wNbh9+XKEruM2uE%CKEG;rl{wpefL4n;Vs&#JkPuX{yJu$8A;a zR*%!=Zb9#mWO^XA%I6D|1F&)k`wE}8p{cRGO`NKkQr%vs!qKXc+EZ|=N;Q>5OYAib zZ7re#`jfRgrBgXA4o$c0p_Bq&8@grDYg%n}ex-Afp%DJqB+G~T4mFAx5r=UZY%M+wwO2D*$7aJ zPot!oGAH`~bWfc}>FWe96#o5-a_D?&qQZj1BoE?F)19N99&m~ij7!luHZ^qGSX20P zVw=X^YgKzgIXKVZbhL1D$>%$|(cUg6KApTN0H!9^1-uo_O4+&MsAdD*YwX*DM zv_qwnoXvc|vd!779G6U5iROxCt76%^FP}a^Y zn*Gphn!R&2<>%*%vDm6rtEjlRm`X}YsI07v)~s1W<>lp6Sy@SI*RG|Sni^WSZXK;( zzn<>7=N{UyVFPX4xRD-s-~rmad9xU|HZ(L)Q&SUd-MUqb&01Po$m{iz&*!7o)>dk3 zYZK$dKp;Tv?d`N}+cxUx=%DS}w^L_lr|@_0*s+5idgvkAxpOD&+O>;PcBhc(2@@q8 zOQ6JKi8N*36q>qsD$U$8lV%;BMc4IQN7o&_j%+7vlyM@1(oUw4eZWrXXVYoM$r&{L z?ddf0_)NO`#MLzGtywhfooRH{yWq$Bh&y{V&F+~^*FSMR%|1Gt=DskO<~=`;7Cy0% zvY*YSh0iXe8=tz77C*h17Cp0wa(Z*<#@-t#`-N<};kg@V$WR?w~u5-AQ*HyNl+$JqI6*%%Z$k^60LY z@1on@xQz;q6;S>wkj2XdwBq;*DtNVk3Xd03(TO4|?8o)BBFaCNPj|m@Hx(Z*rs9*3 z)yWbnd98#>PnOc^{?$}=qKwM=5nd~!^4H3#;pu>_fqYfn74YXmhKz4k2ap(NSg*W(WbXI(dN^e$@#XE>dw@W>kNF) zXI7$Q6qTT0qYa(Vyun(`agl z5=OuJ3Rlyp=_{Z!ee@@$pMze#~wTN9gXA z_ul`&Cg=L{)x~$+NukiSbLL|C33n-IWCp`6q2ynFU^-mQ3E zyx>|+V+pk$A$y3D3JXG^o8QHqWx;j)0&lvW5pV9v425p}fZt?0#2ZKG(6PSW!+Tnr z0B6H}Q$nFL-~HtMvw1h)i01{_SxVVQUOn;r69=~;s?VLVgBvHzk+1w}_6#Z$?ic zd%NViKwyQ_>vDUP9`Eos=<$*i0Lfaotda`u-bfYbsLHFV zsiLZeD$!xB#eG#ZIxX(7&{?goy^l7)$-V*Cdl70kZle1)JwW$8u$k6XcG0HIPIA_{ z$mwpR`Yl_ju?bgogJ@wHNOYa4kGzTLi^{2kk=ZCfX9H-7AE|bZb%%VMM=M-#nvwQQ4{*msO^%a%f^fSuO`W>yD^9Ndc^Osb=<`3j9|0DVC`vYxr|BkkA`2+3U z^%m{kx1aVse2Dfxa)=HdI!q7uJWh`ud6Igbe43to_62(S#iMlOsT1`4vE$VH>?t~W z@-;fve~Mmumx&i(kObndgC(WjsPoPO}rU(kve1SuIG?xU~3NI}RS)VzQdWbHh~A4Li87^n(Z26|YFn z@$GLcDB7?$;UJ~oYnsB(4fceMdk=D&G!#-(d~3$yI!*%gC@t4CGh^{)B?TuzK3h%k zvedf^H|%Aqa!prKqG=<;W4x`^#f2-cX+A*7xWCb4GF^pxeut2}zj0OZ%~vnlx{s^} zDRqBCl4%-0p-=@sU|&#l$LflCb6q z`aiVtTNFr9omXryQ@%P#v1-F8@k6=GXzq-WfZ4 z%j76D+(DVOQCYeMUyRJynX;|V-`*RklL)9r3wRlUH zDSEt^=xjz(tFu`QTMb5!sg5vkM;JAW94lKfR^|b_pxYb}1vvO z6p`;~!n}-HpK26yP%Gn~481RtmZ8Ga%18pER(MpU>QRI)g>jV;1yRB8C}&}34f(qtvV`o9#z-AA$18kUUvX3a1BpDSl#sjt$DGWQG9R?Rnwl) zh?)^@nYi&5S(A~~py5z6n+qiGb$Maghw~aV3No+ODCqKHFq6UaHY&#$dHdD|x4te) z{3~PePli{2ZM!ev_S@1Fhpg(?PC+;9tP_q-Gd>%bi6XSAQ7$88YrR{x28!raCfycW zh+Toa8grdiYkl)QP2Qz9g`p?FE&z1JfxfD(sow4nG)7ePR8i5NlNG%{R&>h<8TTvU z{=^1<@d{tNH(<7BsLn{l2v@54+DtX3%GaTGf>V==;HRxe62F;jh*$EWLljPGe@aH9 zPo!9nZm+D#>z2>OzP1PX+1}`ruW&14(;9tMPH&@IaqcEJ`j~@F-o~kozI;!Iv(wMc zVvh5*>DZpAbMU4Goa|;*{ku~H4#H{8zI?wsV9i)rSd_o6tmc6g#raj$g*6$vB(d)A z%>LOy3B4=I;JUNn>_Gri;@38tyi3+~>e>)8MJY%f zKg#0acl9b$@d^gX%IIn$43dQFV0^Q1;tVPbGSIa8)XPZgaPb$RD znlFQuZ8WJ6pEZxqn#X6&}h<~JU(k4F>78IF>8KQS>vbmZtE_gcl$HX znorch#b?dqv*z(xbFFQU-!KQ_v*v$?v*u|vE4H{@%{=cdX3jlz1w3NZPbO+p*V=g0 z@;Oa3Nv>2SGnvRicjLc_ZpJ(g{wO*Q&c>KHj89|Y(8I>W@sUl@@GzE(iAywy;{|2W ZdEqw|xH=pOxF*m)qfo{<{?l{d{{ui5BRv2B literal 0 HcmV?d00001 diff --git a/official/1.100/devtools/pgEdit.xml b/official/1.100/devtools/pgEdit.xml new file mode 100644 index 0000000..41d18ce --- /dev/null +++ b/official/1.100/devtools/pgEdit.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/official/1.100/docs/Contacting authors.html b/official/1.100/docs/Contacting authors.html new file mode 100644 index 0000000..858354e --- /dev/null +++ b/official/1.100/docs/Contacting authors.html @@ -0,0 +1,35 @@ + + + +Contacting authors + + +