diff options
author | danglassey <danglassey> | 2002-08-14 09:57:17 +0000 |
---|---|---|
committer | danglassey <danglassey> | 2002-08-14 09:57:17 +0000 |
commit | c9458897ebbb739d8db83c80e06512d8a612f743 (patch) | |
tree | f8c5381045887e34388cc6b26cfccc254bf766dc /apps/windoze/CBuilder5/InstallMgr | |
download | sword-sf-cvs-c9458897ebbb739d8db83c80e06512d8a612f743.tar.gz |
*** empty log message ***
Diffstat (limited to 'apps/windoze/CBuilder5/InstallMgr')
44 files changed, 4671 insertions, 0 deletions
diff --git a/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp new file mode 100644 index 0000000..eb74177 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp @@ -0,0 +1,29 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "FTPDownload.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// Important: Methods and properties of objects in VCL can only be +// used in a method called using Synchronize, for example: +// +// Synchronize(UpdateCaption); +// +// where UpdateCaption could look like: +// +// void __fastcall FTPDownload::UpdateCaption() +// { +// Form1->Caption = "Updated in a thread"; +// } +//--------------------------------------------------------------------------- +__fastcall FTPDownload::FTPDownload(bool CreateSuspended) + : TThread(CreateSuspended) +{ +} +//--------------------------------------------------------------------------- +void __fastcall FTPDownload::Execute() +{ + //---- Place thread code here ---- +} +//--------------------------------------------------------------------------- diff --git a/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h new file mode 100644 index 0000000..4ad9e01 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h @@ -0,0 +1,16 @@ +//--------------------------------------------------------------------------- +#ifndef FTPDownloadH +#define FTPDownloadH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +//--------------------------------------------------------------------------- +class FTPDownload : public TThread +{ +private: +protected: + void __fastcall Execute(); +public: + __fastcall FTPDownload(bool CreateSuspended); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp new file mode 100644 index 0000000..a75b7b2 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "InfoFrm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TInfoForm *InfoForm; +//--------------------------------------------------------------------------- +__fastcall TInfoForm::TInfoForm(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TInfoForm::FormShow(TObject *Sender) +{ + AnsiString abouttext = ""; + TMemoryStream *RTFStream = new TMemoryStream(); + + abouttext = abouttext + "{\\fs20\\cf0 " + info.c_str() + " }"; + RTFStream->Clear(); + RTFStream->WriteBuffer(abouttext.c_str(), abouttext.Length()); + RTFStream->Position = 0; + InfoText->Lines->LoadFromStream(RTFStream); + delete RTFStream; +} +//--------------------------------------------------------------------------- +void __fastcall TInfoForm::SpeedButton1Click(TObject *Sender) +{ + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm Binary files differnew file mode 100644 index 0000000..ca189d0 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h new file mode 100644 index 0000000..9bbeef6 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h @@ -0,0 +1,32 @@ +//--------------------------------------------------------------------------- +#ifndef InfoFrmH +#define InfoFrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <Buttons.hpp> +#include <ComCtrls.hpp> +#include <ExtCtrls.hpp> +#include <string> + +//--------------------------------------------------------------------------- +class TInfoForm : public TForm +{ +__published: // IDE-managed Components + TPanel *Panel1; + TPanel *Panel2; + TRichEdit *InfoText; + TSpeedButton *SpeedButton1; + void __fastcall FormShow(TObject *Sender); + void __fastcall SpeedButton1Click(TObject *Sender); +private: // User declarations +public: // User declarations + std::string info; + __fastcall TInfoForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TInfoForm *InfoForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg new file mode 100644 index 0000000..792eb7c --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg @@ -0,0 +1,31 @@ +#------------------------------------------------------------------------------ +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 = swordlib.lib zlib.lib libcurl.lib InstallMgr.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +InstallMgr.exe: InstallMgr.bpr + $(MAKE) + +swordlib.lib: ..\BibleCS\swordlib.bpr + $(MAKE) + +zlib.lib: zlib.bpr + $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +libcurl.lib: libcurl.bpr + $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + + diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr new file mode 100644 index 0000000..1b2a792 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr @@ -0,0 +1,136 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="InstallMgr.exe"/> + <OBJFILES value="InstallMgr.obj MainFrm.obj StatusFrm.obj RemoteMntFrm.obj InfoFrm.obj + cipherfrm.obj UninstallFrm.obj"/> + <RESFILES value="InstallMgr.res"/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES) MainFrm.dfm StatusFrm.dfm RemoteMntFrm.dfm InfoFrm.dfm + cipherfrm.dfm UninstallFrm.dfm"/> + <LIBFILES value="zlib.lib ..\..\..\..\lib\swordlib.lib libcurl.lib curl\lib\ws2_32.lib"/> + <LIBRARIES value="vclx50.lib vcl50.lib"/> + <SPARELIBS value="vcl50.lib vclx50.lib"/> + <PACKAGES value="vcl50.bpi vclx50.bpi vcljpg50.bpi bcbsmp50.bpi qrpt50.bpi vcldb50.bpi + vclbde50.bpi ibsmp50.bpi vcldbx50.bpi teeui50.bpi teedb50.bpi tee50.bpi + nmfast50.bpi dclocx50.bpi"/> + <PATHCPP value=".;"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <DEBUGLIBPATH value="$(BCB)\lib\debug"/> + <RELEASELIBPATH value="$(BCB)\lib\release"/> + <LINKER value="ilink32"/> + <USERDEFINES value="VCL"/> + <SYSDEFINES value="NO_STRICT"/> + <MAINSOURCE value="InstallMgr.cpp"/> + <INCLUDEPATH value="curl\include;..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include"/> + <LIBPATH value="..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib"/> + <WARNINGS value="-w-par -w-8027 -w-8026"/> + <WARNOPTSTR value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I..\BibleCS -I..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr + -I$(BCB)\include -I$(BCB)\include\vcl -I..\..\..\..\include -src_suffix + cpp -DVCL -boa"/> + <CFLAG1 value="-O2 -H=c:\PROGRA~1\borland\CBUILD~2\lib\vcl50.csm -Hc -Vx -Ve -RT- -X- -a8 + -b- -k- -vi -c -tW -tWM"/> + <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/> + <RFLAGS value=""/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value="-D"" -aa -Tpe -x -Gn"/> + </OPTIONS> + <LINKER> + <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/> + <ALLRES value="$(RESFILES)"/> + <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=5 +Release=3 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName=CrossWire Bible Society +FileDescription=SWORD Installation Manager +FileVersion=1.5.3.0 +InternalName=InstallMgr +LegalCopyright=Copyright 2002 by CrossWire Bible Society +LegalTrademarks= +OriginalFilename= +ProductName=The SWORD Project +ProductVersion=1.5.3 +Comments=Seek Jesus who exchanges temporary for eternal + +[HistoryLists\hlIncludePath] +Count=6 +Item0=curl\include;..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item1=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item2=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item3=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item4=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item5=..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include + +[HistoryLists\hlLibraryPath] +Count=5 +Item0=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib +Item2=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib +Item3=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib +Item4=..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=8 +Item0=VCL +Item1=VCL;__STDC__ true +Item2=VCL;__STDC__ +Item3=VCL;_MSC_VER +Item4=VCL __STDC__ +Item5=VCL;_DEBUG +Item6=_DEBUG;VCL +Item7=_DEBUG + +[HistoryLists\hlRunParameters] +Count=1 +Item0=-uninstall + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT>
\ No newline at end of file diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp new file mode 100644 index 0000000..a269603 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp @@ -0,0 +1,36 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop +USERES("InstallMgr.res"); +USEFORM("MainFrm.cpp", MainForm); +USEFORM("StatusFrm.cpp", StatusForm); +USEFORM("RemoteMntFrm.cpp", RemoteMntForm); +USEFORM("InfoFrm.cpp", InfoForm); +USEFORM("cipherfrm.cpp", CipherForm); +USEFORM("UninstallFrm.cpp", UninstallForm); +USELIB("zlib.lib"); +USELIB("..\..\..\..\lib\swordlib.lib"); +USELIB("libcurl.lib"); +USELIB("curl\lib\ws2_32.lib"); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->Title = "Install Manager"; + Application->CreateForm(__classid(TMainForm), &MainForm); + Application->CreateForm(__classid(TStatusForm), &StatusForm); + Application->CreateForm(__classid(TRemoteMntForm), &RemoteMntForm); + Application->CreateForm(__classid(TInfoForm), &InfoForm); + Application->CreateForm(__classid(TCipherForm), &CipherForm); + Application->CreateForm(__classid(TUninstallForm), &UninstallForm); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res Binary files differnew file mode 100644 index 0000000..67f5484 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp new file mode 100644 index 0000000..42e0500 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp @@ -0,0 +1,1110 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +extern "C" { +#include <untgz.h> +} + +#include "MainFrm.h" +#include "StatusFrm.h" +#include "RemoteMntFrm.h" +#include "InfoFrm.h" +#include "cipherfrm.h" +#include "UninstallFrm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" + +#include <swwinlog.h> +#include <shellapi.h> +#include <dirent.h> +#include <fcntl.h> +#include <io.h> +#include <sys/stat.h> +#include <dir.h> +#include <FileCtrl.hpp> + +TMainForm *MainForm; + + +VersionInfo::VersionInfo(const char *version) { + char *buf = new char[ strlen(version) + 1 ]; + char *tok; + major = minor = minor2 = minor3 = 0; + + strcpy(buf, version); + tok = strtok(buf, "."); + if (tok) + major = atoi(tok); + tok = strtok(0, "."); + if (tok) + minor = atoi(tok); + tok = strtok(0, "."); + if (tok) + minor2 = atoi(tok); + tok = strtok(0, "."); + if (tok) + minor3 = atoi(tok); + delete [] buf; +} + + +int VersionInfo::compare(const VersionInfo &vi) const { + if (major == vi.major) + if (minor == vi.minor) + if (minor2 == vi.minor2) + if (minor3 == vi.minor3) + return 0; + else return minor3 - vi.minor3; + else return minor2 - vi.minor2; + else return minor - vi.minor; + else return major - vi.major; +} + + +__fastcall InstallSourceTab::InstallSourceTab(TComponent *Owner, const char *confEnt, const char *type) : TControl(Owner) { + char *buf = new char [ strlen(confEnt) + 1 ]; + + strcpy(buf, confEnt); + + Caption = strtok(buf, "|"); + Source = strtok(0, "|"); + Directory = strtok(0, "|"); + delete [] buf; + Type = type; + mgr = 0; +} + +__fastcall InstallSourceTab::~InstallSourceTab() { + if (mgr) + delete mgr; +} + +__fastcall TMainForm::TMainForm(TComponent* Owner) + : TForm(Owner) +{ + try { + manager = new SWMgr(); + } + catch (...) { + createPathAndFile("./mods.d/globals.conf"); + manager = new SWMgr(); + } + installConf = new SWConfig("./InstallMgr.conf"); + localMgr = 0; +} + + +__fastcall TMainForm::~TMainForm() +{ + delete manager; + delete installConf; + if (localMgr) + delete localMgr; +} + + +void __fastcall TMainForm::FormCreate(TObject *Sender) { + + refreshPageControl(); + + if (SWLog::systemlog) + delete SWLog::systemlog; + SWLog::systemlog = new SWWinLog(this->Handle); // set the system logger to our MSWindows specific SWLog class + + fillInstallTree(); + fillSourceTree(getLocalDir(), localTree); +} + + +void TMainForm::refreshPageControl() { + SectionMap::iterator sources; + ConfigEntMap::iterator sourceBegin; + ConfigEntMap::iterator sourceEnd; + + while (PageControl1->PageCount > 1) { + delete PageControl1->Pages[1]; + } + + sources = installConf->Sections.find("Sources"); + passive = (!stricmp((*installConf)["General"]["PassiveFTP"].c_str(), "true")); + + if (sources != installConf->Sections.end()) { + sourceBegin = sources->second.lower_bound("FTPSource"); + sourceEnd = sources->second.upper_bound("FTPSource"); + + if (sourceBegin != sourceEnd) { + while (sourceBegin != sourceEnd) { + InstallSourceTab *ist = new InstallSourceTab(this, sourceBegin->second.c_str(), "FTP"); + addSource(ist); + sourceBegin++; + } + } + } +} + + +void TMainForm::addSource(InstallSourceTab *ist) +{ + TTabSheet *newtab = new TTabSheet(this); + TTreeView *newtree = new TTreeView(this); + TSpeedButton *newbutton = new TSpeedButton(this); + TPanel *newpanel = new TPanel(this); + char buf[512]; + SectionMap::iterator sit; + + newtab->Caption = ist->Caption.c_str(); + newtab->Hint = ist->Source.c_str(); + newtab->ShowHint = true; + newtab->PageControl = PageControl1; + ist->Parent = newtab; + ist->tree = newtree; + newpanel->Parent = newtab; + newpanel->Align = alTop; + newpanel->BevelOuter = bvNone; + newpanel->BevelInner = bvNone; + newpanel->Height = 25; + newbutton->Parent = newpanel; + newbutton->Caption = "Refresh from Remote Source"; + newbutton->Width = 210; + newbutton->OnClick = RefreshRemoteSource; + newbutton->Flat = true; + newbutton->Glyph = SpeedButton2->Glyph; + newtree->Parent = newtab; + newtree->Align = alClient; + newtree->ReadOnly = true; + newtree->OnDblClick = localTreeDblClick; + newtree->Images = ImageList1; + newtree->StateImages = ImageList2; + string parent = "./sources/" + ist->Source + "/file"; + createParent(parent.c_str()); + parent = "./sources/" + ist->Source; + fillSourceTree(parent.c_str(), newtree); +} + + +const char *TMainForm::getLocalDir() +{ + ConfigEntMap::iterator entry; + + entry = installConf->Sections["Sources"].find("LocalPath"); + if (entry == installConf->Sections["Sources"].end()) { + installConf->Sections["Sources"].insert(ConfigEntMap::value_type("LocalPath", "d:/sword")); + entry = installConf->Sections["Sources"].find("LocalPath"); + } + return entry->second.c_str(); + +} + + +void TMainForm::setLocalDir(const char *idir) +{ + installConf->Sections["Sources"].erase("LocalPath"); installConf->Sections["Sources"].insert(ConfigEntMap::value_type("LocalPath", idir)); +} + + +//--------------------------------------------------------------------------- +void __fastcall TMainForm::LocalPath1Click(TObject *Sender) +{ + AnsiString Dir = "C:"; + WideString Root = getLocalDir(); + SelectDirectory("Select Local Path", Root , Dir); + +/* + localPathDlg->Title = "Select a file in the directory to choose"; + localPathDlg->InitialDir = getLocalDir(); + if (localPathDlg->Execute()) { + char *buf = new char [ strlen(localPathDlg->FileName.c_str()) + 1 ]; + + strcpy(buf, localPathDlg->FileName.c_str()); + int end = strlen(buf) - 1; + while (end) { + if ((buf[end] == '/') || (buf[end] == '\\')) + break; + end--; + } + buf[end+1] = 0; + setLocalDir(buf); + delete [] buf; + } +*/ + + setLocalDir(Dir.c_str()); + + installConf->Save(); + fillSourceTree(getLocalDir(), localTree); +} +//--------------------------------------------------------------------------- + +void TMainForm::fillInstallTree() +{ + ModMap::iterator mods; + TTreeNode *node; + string nodeName; + + installTree->Items->Clear(); + + if (!manager->configPath) + return; + + for (mods = manager->Modules.begin(); mods != manager->Modules.end(); mods++) { + for (node = installTree->Items->GetFirstNode(); node; node = node->getNextSibling()) { + if (!strcmp(node->Text.c_str(), mods->second->Type())) { + break; + } + } + if (!node) { // Add Section + if (!strncmp(mods->second->Type(), "Bibl", 4)) // If Bibles, put first in list + node = installTree->Items->AddChildFirst(0, mods->second->Type()); + else node = installTree->Items->AddChild(0, mods->second->Type()); + } + nodeName = "["; + nodeName += mods->second->Name(); + nodeName += "] "; + nodeName += mods->second->Description(); + node = installTree->Items->AddChildObject(node, nodeName.c_str(), mods->second->Name()); + } + for (node = installTree->Items->GetFirstNode(); node; node = node->getNextSibling()) + node->Expand(true); + node = installTree->Items->GetFirstNode(); + if (node) + node->MakeVisible(); +} + + +void TMainForm::fillSourceTree(const char *sourceConf, TTreeView *tree) +{ + ModMap::iterator mods; + TTreeNode *node; + SectionMap::iterator sections, targetSection; + ConfigEntMap::iterator entry; + string secName; + const char * modDesc; + string nodeName; + string targetVersion; + string sourceVersion; + bool cipher; + bool showLocked = LockedModules1->Checked; + + SWMgr *mgr; + + if (tree == localTree) { + if (localMgr) + delete localMgr; + mgr = localMgr = new SWMgr(sourceConf); + } + else { + + InstallSourceTab *ist = (InstallSourceTab *) tree->Parent->Controls[0]; + if (ist->mgr) + delete ist->mgr; + mgr = ist->mgr = new SWMgr(sourceConf); + } + + tree->Items->Clear(); + + if (!mgr->configPath) + return; + + for (sections = mgr->config->Sections.begin(); sections != mgr->config->Sections.end(); sections++) { + + cipher = false; + + if (!strcmp(sections->first.c_str(), "Globals")) // skip [Globals] + continue; + + entry = sections->second.find("CipherKey"); + if (entry != sections->second.end()) { + if (showLocked) + cipher = true; + else continue; + } + + mods = mgr->Modules.find(sections->first.c_str()); + if (mods != mgr->Modules.end()) + secName = mods->second->Type(); + else { + secName = "Other"; + } + + string misc1 = ((entry = sections->second.find("Category")) != sections->second.end()) ? (*entry).second : (string)""; + if (misc1.length() > 0) + secName = misc1; + + entry = sections->second.find("Description"); + if (entry != sections->second.end()) + modDesc = entry->second.c_str(); + else modDesc = ""; + + + targetVersion = "0.0"; + sourceVersion = "1.0"; + + entry = sections->second.find("Version"); + if (entry != sections->second.end()) + sourceVersion = entry->second.c_str(); + + targetSection = manager->config->Sections.find(sections->first); + if (targetSection != manager->config->Sections.end()) { + targetVersion = "1.0"; + entry = targetSection->second.find("Version"); + if (entry != targetSection->second.end()) + targetVersion = entry->second; + } + + if (VersionInfo(sourceVersion.c_str()) > VersionInfo(targetVersion.c_str())) { + for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling()) { + if (!strcmp(node->Text.c_str(), secName.c_str())) { + break; + } + } + + if (!node) { // Add Section + if (!strncmp(secName.c_str(), "Bibl", 4)) // If Bibles, put first in list + node = tree->Items->AddChildFirst(0, secName.c_str()); + else node = tree->Items->AddChild(0, secName.c_str()); + node->ImageIndex = 0; + } + nodeName = "[" + sections->first + "] " + modDesc; + node = tree->Items->AddChildObject(node, nodeName.c_str(), (void *) sections->first.c_str()); + if (VersionInfo(targetVersion.c_str()) < VersionInfo("1.0")) { + node->ImageIndex = 1; + node->SelectedIndex = 1; + } + else { + node->ImageIndex = 2; + node->SelectedIndex = 2; + } + if (cipher) { + node->ImageIndex += 2; + node->SelectedIndex += 2; + } + node->StateIndex = 0; + } + } + for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling()) + node->Expand(true); + node = tree->Items->GetFirstNode(); + if (node) + node->MakeVisible(); +} + + +void __fastcall TMainForm::Button5Click(TObject *Sender) +{ + TTreeView *tree; + for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) { + if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) { + tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]); + break; + } + } + TTreeNode *node = tree->Selected; + if (node) { + if (node->Parent) { + if (node->StateIndex == 1) + node->StateIndex = 0; //node->StateIndex; + else node->StateIndex = 1; + tree->Repaint(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::localTreeDblClick(TObject *Sender) +{ + Button5Click(Sender); +} +//--------------------------------------------------------------------------- + +int TMainForm::selectAll(TTreeView *tree, bool sel) +{ + TTreeNode *node; + TTreeNode *node2; + int retCount = 0; + + for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling()) { + for (node2 = node->getFirstChild(); node2; node2 = node2->getNextSibling()) { + if (node2->StateIndex == 1) { + if (!sel) { + node2->StateIndex = 0; //node2->StateIndex; + retCount++; + } + } + else { + if (sel) { + node2->StateIndex = 1; + retCount++; + } + } + } + } + return retCount; +} + + +void __fastcall TMainForm::Button6Click(TObject *Sender) // SELECT ALL +{ + TTreeView *tree; + for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) { + if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) { + tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]); + break; + } + } + if (!selectAll(tree, true)) + selectAll(tree, false); + tree->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Image1Click(TObject *Sender) +{ + ShellExecute(this->Handle, "open", "http://www.crosswire.org", NULL, NULL, SW_SHOWNORMAL); + +} +//--------------------------------------------------------------------------- + +int TMainForm::removeModule(const char *modName) +{ + SectionMap::iterator module; + ConfigEntMap::iterator fileBegin; + ConfigEntMap::iterator fileEnd, entry; + + module = manager->config->Sections.find(modName); + + if (module != manager->config->Sections.end()) { + entry = module->second.find("CipherKey"); + if (entry != module->second.end()) + CipherForm->cipherEdit->Text = entry->second.c_str(); + + fileBegin = module->second.lower_bound("File"); + fileEnd = module->second.upper_bound("File"); + + if (fileBegin != fileEnd) { // remove each file + while (fileBegin != fileEnd) { + //remove file + remove(fileBegin->second.c_str()); + fileBegin++; + } + } + else { //remove all files in DataPath directory + + DIR *dir; + struct dirent *ent; + ConfigEntMap::iterator entry; + string modDir; + string modFile; + + entry = module->second.find("DataPath"); + if (entry != module->second.end()) { + modDir = entry->second.c_str(); + entry = module->second.find("ModDrv"); + if (entry != module->second.end()) { + if (!strcmp(entry->second.c_str(), "RawLD") || !strcmp(entry->second.c_str(), "RawLD4") || !strcmp(entry->second.c_str(), "zLD") || !strcmp(entry->second.c_str(), "RawGenBook") || !strcmp(entry->second.c_str(), "zGenBook")) { + char *buf = new char [ strlen(modDir.c_str()) + 1 ]; + + strcpy(buf, modDir.c_str()); + int end = strlen(buf) - 1; + while (end) { + if (buf[end] == '/') + break; + end--; + } + buf[end] = 0; + modDir = buf; + delete [] buf; + } + } + + if (dir = opendir(modDir.c_str())) { + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = modDir; + modFile += "/"; + modFile += ent->d_name; + remove(modFile.c_str()); + } + } + closedir(dir); + } + if (dir = opendir(manager->configPath)) { // find and remove .conf file + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = manager->configPath; + modFile += "/"; + modFile += ent->d_name; + SWConfig *config = new SWConfig(modFile.c_str()); + if (config->Sections.find(modName) != config->Sections.end()) { + delete config; + remove(modFile.c_str()); + } + else delete config; + } + } + closedir(dir); + } + } + } + return 0; + } + return 1; +} + + +int TMainForm::createParent(const char *pName) +{ + char *buf = new char [ strlen(pName) + 1 ]; + int retCode = 0; + + strcpy(buf, pName); + int end = strlen(buf) - 1; + while (end) { + if (buf[end] == '/') + break; + end--; + } + buf[end] = 0; + if (strlen(buf)>0) { + if (access(buf, 02)) { // not exists with write access? + if ((retCode = mkdir(buf))) { + createParent(buf); + retCode = mkdir(buf); + } + } + } + else retCode = -1; + delete [] buf; + return retCode; +} + + +int TMainForm::createPathAndFile(const char *fName) +{ + int fd; + + fd = open(fName, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); + if (fd < 1) { + createParent(fName); + fd = open(fName, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE); + } + return fd; +} + + +int TMainForm::copyFileToCWD(const char *sourceDir, const char *fName) +{ + string sourcePath = sourceDir; + sourcePath += fName; + + string dest; + dest = manager->prefixPath; + if ((manager->prefixPath[strlen(manager->prefixPath)-1] != '\\') && ( manager->prefixPath[strlen(manager->prefixPath)-1] != '/')) + dest += "/"; + dest += fName; + + return copyFile(sourcePath.c_str(), dest.c_str()); +} + + +int TMainForm::copyFile(const char *sourceFile, const char *targetFile) +{ + int sfd, dfd, len; + char buf[4096]; + + if ((sfd = open(sourceFile, O_RDONLY|O_BINARY)) < 1) + return -1; + if ((dfd = createPathAndFile(targetFile)) < 1) + return -1; + + do { + len = read(sfd, buf, 4096); + write(dfd, buf, len); + } + while(len == 4096); + close(dfd); + close(sfd); + + return 0; +} + + +int TMainForm::installModule(const char *modName, InstallSourceTab *ist) +{ + SectionMap::iterator module, section; + ConfigEntMap::iterator fileBegin; + ConfigEntMap::iterator fileEnd; + ConfigEntMap::iterator entry; + string sourceDir; + string buffer; + bool aborted = false; + bool cipher = false; + + if (ist) + sourceDir = "./sources/" + ist->Source; + else sourceDir = getLocalDir(); + + SWMgr mgr(sourceDir.c_str()); + + module = mgr.config->Sections.find(modName); + + if (module != mgr.config->Sections.end()) { + + entry = module->second.find("CipherKey"); + if (entry != module->second.end()) + cipher = true; + + fileEnd = module->second.upper_bound("File"); + fileBegin = module->second.lower_bound("File"); + + if (fileBegin != fileEnd) { // copy each file + if (ist) { + while (fileBegin != fileEnd) { // ftp each file first + buffer = sourceDir + "/" + fileBegin->second; + if (FTPCopy(ist, fileBegin->second.c_str(), buffer.c_str())) { + aborted = true; + break; // user aborted + } + fileBegin++; + } + fileBegin = module->second.lower_bound("File"); + } + + if (!aborted) { + // DO THE INSTALL + while (fileBegin != fileEnd) { + copyFileToCWD(sourceDir.c_str(), fileBegin->second.c_str()); + fileBegin++; + } + } + //--------------- + + if (ist) { + fileBegin = module->second.lower_bound("File"); + while (fileBegin != fileEnd) { // delete each tmp ftp file + buffer = sourceDir + "/" + fileBegin->second; + remove(buffer.c_str()); + fileBegin++; + } + } + } + else { //copy all files in DataPath directory + DIR *dir; + struct dirent *ent; + ConfigEntMap::iterator entry; + string modDir; + string modFile; + string sourceOrig = sourceDir; + + entry = module->second.find("DataPath"); + if (entry != module->second.end()) { + modDir = entry->second.c_str(); + entry = module->second.find("ModDrv"); + if (entry != module->second.end()) { + if (!strcmp(entry->second.c_str(), "RawLD") || !strcmp(entry->second.c_str(), "RawLD4") || !strcmp(entry->second.c_str(), "zLD") || !strcmp(entry->second.c_str(), "RawGenBook") || !strcmp(entry->second.c_str(), "zGenBook")) { + char *buf = new char [ strlen(modDir.c_str()) + 1 ]; + + strcpy(buf, modDir.c_str()); + int end = strlen(buf) - 1; + while (end) { + if (buf[end] == '/') + break; + end--; + } + buf[end] = 0; + modDir = buf; + delete [] buf; + } + } + + if (ist) { + buffer = sourceDir + "/" + modDir; + if (FTPCopy(ist, modDir.c_str(), buffer.c_str(), true)) { + aborted = true; // user aborted + } + } + sourceDir += "/"; + sourceDir += modDir; + if (!aborted) { + if (dir = opendir(sourceDir.c_str())) { + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = modDir; + modFile += "/"; + modFile += ent->d_name; + copyFileToCWD(sourceOrig.c_str(), modFile.c_str()); + } + } + closedir(dir); + } + } + if (ist) { // delete tmp ftp files + if (dir = opendir(sourceDir.c_str())) { + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = sourceOrig + "/" + modDir; + modFile += "/"; + modFile += ent->d_name; + remove(modFile.c_str()); + } + } + closedir(dir); + } + } + sourceDir = sourceOrig; + sourceDir += "/mods.d/"; + if (!aborted) { + if (dir = opendir(sourceDir.c_str())) { // find and copy .conf file + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = sourceDir; + modFile += ent->d_name; + SWConfig *config = new SWConfig(modFile.c_str()); + if (config->Sections.find(modName) != config->Sections.end()) { + delete config; + string targetFile = manager->configPath; //"./mods.d/"; + targetFile += "/"; + targetFile += ent->d_name; + copyFile(modFile.c_str(), targetFile.c_str()); + if (cipher) { + CipherForm->modName = modName; + CipherForm->confFile = targetFile; + if (CipherForm->ShowModal() == mrCancel) { + removeModule(modName); + aborted = true; + } + } + } + else delete config; + } + } + closedir(dir); + } + } + } + } + return (aborted) ? -1 : 0; + } + return 1; +} + + +void TMainForm::fillAllSourceTrees() +{ + fillSourceTree(getLocalDir(), localTree); + for (int i = 1; i < PageControl1->PageCount; i++) { + InstallSourceTab *ist = (InstallSourceTab *) MainForm->PageControl1->Pages[i]->Controls[0]; + string parent = "./sources/" + ist->Source; + fillSourceTree(parent.c_str(), ist->tree); + } +} + + +void __fastcall TMainForm::Button4Click(TObject *Sender) // REMOVE MODULE +{ + TTreeNode *node = installTree->Selected; + if (node) { + if (node->Parent) { + removeModule((const char *)node->Data); + delete manager; + manager = new SWMgr(); + fillInstallTree(); + fillAllSourceTrees(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Button2Click(TObject *Sender) // INSTALL +{ + TTreeNode *node; + int count = 0; + int abort = 0; + + class TWaitCursor { + public: + TWaitCursor() : oldc(Screen->Cursor) { Screen->Cursor = crHourGlass; } + ~TWaitCursor() { Screen->Cursor = oldc; } + private: + TCursor oldc; + } wait; // show hourglass + + TTreeView *tree; + for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) { + if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) { + tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]); + break; + } + } + + for (node = tree->Items->GetFirstNode(); node; node = node->GetNext()) { + if (node->StateIndex == 1) + count++; + } // do true progress bar + + if (!count) { + MessageBox(this->WindowHandle, "Please first choose which modules you would like to install by double-clicking a module in the 'Available' tree.", "Please select modules first.", MB_OK); + return; // if nothing is selected, do nothing + } + + progressBar->Max = count; + progressBar->Position = 0; + + for (node = tree->Items->GetFirstNode(); node; node = node->GetNext()) { + if (node->StateIndex == 1) { // if selected for install + CipherForm->cipherEdit->Text = ""; + if ((node->ImageIndex == 2) || (node->ImageIndex == 4)) { // if this is an upgrade + removeModule((const char *)node->Data); + } + // install module + statusBar->Caption = "Installing: " + node->Text + "..."; + statusBar->Repaint(); + if (tree == localTree) + abort = installModule((const char *)node->Data); + else abort = installModule((const char *)node->Data, (InstallSourceTab *) PageControl1->ActivePage->Controls[0]); + if (abort) + break; + progressBar->Position++; + } + } + delete manager; + manager = new SWMgr(); + fillInstallTree(); + fillAllSourceTrees(); + statusBar->Caption = ""; + progressBar->Position = 0; +} + + +int TMainForm::FTPCopy(InstallSourceTab *ist, const char *src, const char *dest, bool dirTransfer, const char *suffix) +{ + StatusForm->ist = ist; + StatusForm->src = src; + StatusForm->dest = dest; + StatusForm->suffix = suffix; + StatusForm->dirTransfer = dirTransfer; + StatusForm->passive = passive; + Application->ProcessMessages(); + if (StatusForm->ShowModal() == mrCancel) + return -1; + else return 0; +} + + +void __fastcall TMainForm::RefreshRemoteSource(TObject *Sender) +{ + InstallSourceTab *ist = (InstallSourceTab *) MainForm->PageControl1->ActivePage->Controls[0]; + DIR *dir; + struct dirent *ent; + ConfigEntMap::iterator entry; + string modDir; + string modFile; + string root = "./sources/"; + root += ist->Source.c_str(); + string target = root + "/mods.d"; + + if (dir = opendir(target.c_str())) { + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + modFile = target; + modFile += "/"; + modFile += ent->d_name; + remove(modFile.c_str()); + } + } + closedir(dir); + } + + + string archive = root + "/mods.d.tar.gz"; + if (!FTPCopy(ist, "mods.d.tar.gz", archive.c_str(), false)) { + int fd = open(archive.c_str(), O_RDONLY|O_BINARY); + untargz(fd, root.c_str()); + close(fd); + } + else FTPCopy(ist, "mods.d", target.c_str(), true, ".conf"); + + target = "./sources/"; + target += ist->Source.c_str(); + + fillSourceTree(target.c_str(), ist->tree); +} + + + +void __fastcall TMainForm::SpeedButton1Click(TObject *Sender) +{ + InfoForm->Caption = "W A R N I N G"; + InfoForm->info = "\\qc {\\b \\fs20 -=+* WARNING *+=- -=+* WARNING *+=-}\\par\\par\\pard "; + InfoForm->info += "Although Install Manager provides a convenient way for installing and upgrading SWORD components, it also uses a systematic method for accessing sites which gives packet sniffers a target to lock into for singling out users. \\par\\par "; + InfoForm->info += "\\b\\qc IF YOU LIVE IN A PERSECUTED COUNTRY AND DO NOT WISH TO RISK DETECTION, YOU SHOULD *NOT* USE INSTALL MANAGER'S REMOTE SOURCE FEATURES."; + InfoForm->ShowModal(); + if (RemoteMntForm->ShowModal() == mrOk) { + delete installConf; + installConf = new SWConfig("./InstallMgr.conf"); + + refreshPageControl(); + } +} + +void __fastcall TMainForm::SpeedButton5Click(TObject *Sender) +{ + TTreeView *tree; + InstallSourceTab *ist = 0; + SectionMap::iterator module; + ConfigEntMap::iterator entry, entryEnd; + string sourceDir; + + if (PageControl1->ActivePage != PageControl1->Pages[0]) { + ist = (InstallSourceTab *) PageControl1->ActivePage->Controls[0]; + tree = ist->tree; + } + else tree = localTree; + + TTreeNode *node = tree->Selected; + if (node) { + if (node->Parent) { + if (ist) + sourceDir = "./sources/" + ist->Source; + else sourceDir = getLocalDir(); + SWMgr *mgr = new SWMgr(sourceDir.c_str()); + + module = mgr->config->Sections.find((const char *)node->Data); + + if (module != mgr->config->Sections.end()) { + string targetVersion = "0.0"; + string sourceVersion = "1.0"; + SectionMap::iterator targetSection; + + entry = module->second.find("Version"); + if (entry != module->second.end()) + sourceVersion = entry->second.c_str(); + + targetSection = manager->config->Sections.find(module->first); + if (targetSection != manager->config->Sections.end()) { + targetVersion = "1.0"; + entry = targetSection->second.find("Version"); + if (entry != targetSection->second.end()) + targetVersion = entry->second; + } + if (VersionInfo(targetVersion.c_str()) < VersionInfo("1.0")) { + InfoForm->info = "\\pard{\\b * Additional Module Available for Install. } \\par "; + } + else { + InfoForm->info = "\\pard{\\b + Upgraded Module Available for Install.}\\par\\tab Current Version: \\tab " + targetVersion + " \\par\\tab Upgrade Version:\\tab " + sourceVersion + " \\par "; + bool changes = false; + for (entry = module->second.begin(); entry != module->second.end(); entry++) { + if (!strncmp(entry->first.c_str(), "History_", 8)) { + if (VersionInfo(&entry->first.c_str()[8]) > VersionInfo(targetVersion.c_str())) { + if (!changes) { + changes = true; + InfoForm->info += "\\par{\\b Changes: }\\par "; + } + InfoForm->info += "\\tab "; + InfoForm->info += entry->second.c_str(); + InfoForm->info += "\\par "; + } + } + } + } + + entry = module->second.find("About"); + if (entry != module->second.end()) { + InfoForm->info += "\\par{\\b About: } \\par\\par "; + InfoForm->info += entry->second.c_str(); + } + InfoForm->Caption = "Module Information"; + InfoForm->ShowModal(); + } + delete mgr; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Exit1Click(TObject *Sender) +{ + Close(); +} +//--------------------------------------------------------------------------- + + +void TMainForm::deleteAllModules() { + + SWMgr *mgr = new SWMgr(); + + + int count = mgr->Modules.size(); + + if (!count) + return; + + UninstallForm->Show(); + UninstallForm->ProgressBar1->Max = count; + UninstallForm->ProgressBar1->Position = 0; + + ModMap::iterator it; + for (it = mgr->Modules.begin(); it != mgr->Modules.end(); it++) { + string label = "Uninstalling: ["; + label += it->second->Name(); + label += "] "; + label += it->second->Description(); + UninstallForm->Label1->Caption = label.c_str(); + UninstallForm->Label1->Repaint(); + removeModule(it->second->Name()); + UninstallForm->ProgressBar1->Position = UninstallForm->ProgressBar1->Position + 1; + UninstallForm->ProgressBar1->Repaint(); + } + delete mgr; + UninstallForm->Hide(); + return; +} +void __fastcall TMainForm::FormShow(TObject *Sender) +{ + for (int i=0;i<=ParamCount();i++) { + if (LowerCase(ParamStr(i)) == "-uninstall") { + deleteAllModules(); + Application->Terminate(); + } + } + +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::LockedModules1Click(TObject *Sender) { + LockedModules1->Checked = !(LockedModules1->Checked); + + if (LockedModules1->Checked) { + InfoForm->Caption = "About Locked Modules"; + InfoForm->info = "\\qc {\\b \\fs20 About Locked Modules}\\par\\par\\pard "; + + InfoForm->info += "Unfortunately, we are unable to legally provide these modules to the general public at this time. We are making attempts to gain permission from the copyright holders, but until such an agreement is arranged, these modules are only available to our developers and testers. We hope to be able to provide some of these to you soon. \\par\\par\\pard "; + InfoForm->info += "If you would like to contribute to the project by contacting a publisher seeking distribution permission for CrossWire, your efforts would be very appreciated-- especially in regard to non-English texts. Please subscribe to our developers' forum per instructions on our website, following the [Mailing Lists] link, and post a message stating how you would like to help. Thank you. \\par\\par\\pard "; + InfoForm->info += "\t-CrossWire Bible Society. "; + InfoForm->ShowModal(); + } + fillAllSourceTrees(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Contents1Click(TObject *Sender) +{ + SWConfig optionsconf("options.conf"); + string helpDir; + ConfigEntMap::iterator it = optionsconf.Sections["Help"].find("Directory"); + if (it != optionsconf.Sections["Help"].end()) + helpDir = (*it).second; + else helpDir = ".\\help"; + + string helpExe = helpDir + "\\Sword.chm::modulesh.html#instmgr"; + ShellExecute(this->Handle, "open", "hh", helpExe.c_str(), NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm new file mode 100644 index 0000000..97c9de9 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm @@ -0,0 +1,2224 @@ +object MainForm: TMainForm
+ Left = 361
+ Top = 228
+ Width = 597
+ Height = 475
+ Caption = 'Install Manager'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ Menu = MainMenu1
+ OldCreateOrder = False
+ Position = poScreenCenter
+ Scaled = False
+ OnCreate = FormCreate
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter1: TSplitter
+ Left = 281
+ Top = 81
+ Width = 3
+ Height = 326
+ Cursor = crHSplit
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 589
+ Height = 81
+ Align = alTop
+ AutoSize = True
+ BorderStyle = bsSingle
+ TabOrder = 0
+ object Image1: TImage
+ Left = 1
+ Top = 1
+ Width = 583
+ Height = 75
+ Hint = 'http://www.crosswire.org'
+ Align = alClient
+ AutoSize = True
+ Center = True
+ ParentShowHint = False
+ Picture.Data = {
+ 07544269746D6170E69A0000424DE69A0000000000003600000028000000AF00
+ 00004B0000000100180000000000B09A0000120B0000120B0000000000000000
+ 0000403B3B817E7E8077768177777D74738076767D73737C7271766C6C796F6F
+ 746B6A726867756B6A736969726867756A6A726868776C6C736868726767766B
+ 6B736968716766766C6B746968726867746A69736968746A6A726767766B6A72
+ 6766726767716665726766736868746868716665706564766B6A766A6A796C6C
+ 776B6A776B6B766A69786B6A776A69766968766868766968776A697367667669
+ 69776969776A6A766A69786B6A756767776968776969786A6977696879696977
+ 6867776867776867796A69796969796A69776767766666756564726161776666
+ 7867667866667968677767667766657968677765647563627462617665647866
+ 647764637766657464637A68677A68677866657A69687A6A6976676675646375
+ 6463766463776564746261756463746463776766756463736261756564756362
+ 7665647666657565647464637766657767667667667768677565647968687969
+ 687C6D6C796A6A7567667567667769687A6C6B796B6A76686875686773666677
+ 6B6A786C6B7A6D6D756969756969766A6A756A69746968726666776C6C786D6D
+ 786E6D766B6B776C6C766C6C736968746B6A786E6E776D6D756B6B786E6E7A70
+ 6F7A6F6F796F6E796F6E766C6C786F6F776D6D756B6A7B7170786E6E776D6D7B
+ 7271766D6C7A7070786F6F786E6E7C72727A7170776D6D756C6C776F6F78706F
+ 736B6A776E6E756D6D8077763A3535000000817776FFF9F7F0DCDAFEEAE8FDE8
+ E7FFEEEDF9E4E3FFECEAF2DDDCFCE8E7F9E4E3F5E1E0F7E2E1F9E4E3FAE5E4FC
+ E6E5F7E1E0F7E1E0FCE6E5F9E4E2FAE4E3F9E3E2F9E2E1FFE8E7FEE7E6F9E2E0
+ FBE4E3FDE8E6FCE7E6F9E3E2FAE3E2FBE4E3F5DEDCF3DBDAF9E2E0FDE5E3FDE4
+ E4FCE2E2F7DEDDFAE0DEF6DDDBFDE3E2FFE6E5FFE7E6FFE4E3FFE6E4FFE7E5FF
+ E5E4FFE5E4F5D8D7F8DCDBFFE8E7FFE9E8FFE4E3FFE2E1FDE2E0FFE5E4FBE0DF
+ FBDEDDFFE0E0FFE0DFFEDEDDF5D4D4FBDAD9FFDFDCFFE0DEFFE4E2FFE4E2FFE2
+ E1FFDFDEFEDEDCFFDEDDFAD7D6FDDAD9FFDCDBFCD7D6F7D1CFFCD8D6FFDBDAFF
+ DEDCFFD8D6FED5D3FFDBD9FFDDDBFFD9D6FFD8D7FFDEDCFCD8D6FFDDDBFCD4D2
+ F3CDCBF8D3D1FFDEDCFFDEDDFCD7D6FFDDDBFED8D6FFD8D6FFD9D6FED8D7F9D5
+ D4FFDCDBFBD7D5F8D4D3FAD7D4FCD8D6F9D6D4FCDAD8FCDAD8FCD9D7FFDFDCFF
+ E5E3FFE4E2FFE1DFFFDDDBFFE2E0FFE0DEFFE4E2FFE7E5FFE2E1FCDDDCF9DBD9
+ FEDFDDFEE0DEFEE0DEFFE2E1FFE3E2FFE7E5FEE2E0FFECEBFFEAEAFFE8E7FFE9
+ E8FFECEAFFE7E6FDE5E4FFEAEAFFE8E8FFEBEAFFE9E9FCE6E6FEEAE9FCE7E6FD
+ E8E7FFF1F0FEE8E7F8E2E1FFEBEAFFF0EEFFEAE9FFEDECFEE9E9FDE8E8FFEEEE
+ FFECEBFFEFEEFFF2F0FFEAE9F5E0DFFFEFEEF8E4E2FFECEBFFEDECFFEAE9FFF1
+ F0FFF2F1FFEFEEFFEFEEFFEFEEFFF2F1FCE9E8FFF3F2FFF1F0FFFFFF80787700
+ 00007C7272FCEFEDCBB8B7E6D3D1E8D5D4E5D3D1E3D0CFEFDBDADBC7C6E2CFCE
+ E9D6D5E3D1D0E1CECDE0CDCCE3CFCEDDC8C7DFCBCAE8D4D3E7D3D2E9D4D3EDD9
+ D8EDD8D7E5D0CFE6D1D0E2CDCCEAD5D4E3CECCE7D2D1EFDBDAEEDAD9E9D4D3F0
+ DCDBEBD6D4DEC8C7E6CFCEE4CDCCE6CFCEE3CBCBE0C8C7E5CDCCEBD3D2E8D0CF
+ E5CCCBE5CCCBE8CECDE9D0CEEBD0CFEDD3D3F1D6D5E2C7C5DFC5C4EED5D4F1D9
+ D8F0D7D6E7CBCAECD0D0EBD1D0EBD2D1F1D6D5EDD1D0EBCDCCECCFCDDCBEBDE7
+ C8C6F1D1CFF5D4D2EDCECCE5C5C3F1D1D0EFD1D0EDCECDEFCFCDECCBCAEAC9C7
+ EBCAC8ECC9C8E0BCBAEAC7C5EECBC9EAC8C6EEC9C7EDC6C4F1CBC9ECCAC9EECB
+ CAF2CCCAEECAC8E7C4C2F2CCCBECC5C3E9C5C2DEBAB8EBC9C7F2D2D0E9C6C4EE
+ CAC8EECAC8ECC6C4EEC8C7ECC9C8E7C6C4ECCBC9E9C7C5E8C7C5E8C6C4EBC9C8
+ E4C4C3E3C3C2E3C2C0E9C6C5E8C8C5ECCDCBEECDCBF0D0CEEDCECCEECECCE8CA
+ C9E3C5C3EFD1D0F1D4D3ECD0CEEACECDEFD3D2F0D4D2F3D8D6ECD0CFEAD0CEEC
+ D0CFE5CBC8F2D9D7E9D0CFECD3D1F1D9D8F2DADAECD4D4EAD3D3E7D1D0ECD6D6
+ E9D5D5EBD8D8ECDADAEEDDDCF0DDDCE8D3D3EDD8D7F1DCDBF0DADAE3CDCDEBD7
+ D6E9D5D5ECDAD9EEDDDCE6D5D5E7D6D6E7D5D4EDD9D9E8D4D3EFDBDAE6D2D0ED
+ D9D8E6D3D2E4D0CFF2DDDBEFDCDBF3E1E0F5E3E2ECDAD9F0DEDDF2E0DFF5E3E1
+ EBD9D8F2E0DFE9D8D7FEF1F07971700000007D7372FFF3F1CDBAB9ECD8D7DECC
+ CBDCC9C8E7D3D1F3DFDED0BDBCDDCAC9E3D0CFD6C2C1E3D0CFE4D0CFD7C3C2DA
+ C6C5DBC6C5E3CFCED8C4C4D6C2C1E7D3D2E7D3D1DCC7C7DFCACAD7C2C1E5CFCE
+ D5C0BFE5D0CFEDD9D8EFDAD9EDD8D7EED9D8F0DBDAEAD4D3DCC6C4DDC7C6DAC3
+ C2DAC1C1D9C1C0DBC2C1E4CBCAD9C1BFDDC4C3DABFBEDFC5C4DFC6C4DAC0C0E2
+ C9C9DFC6C5E3C9C8DEC4C3E2C8C6E3C9C8E9D1D0DEC5C4EACECDE0C3C2DCC2C1
+ E6CCCBE5C9C8E0C3C1EED0CFDEBEBDE9C9C8E9C7C6EDCAC8D8B8B68F7B7AD3B4
+ B2F0D1CFF8D8D6F4D1D0E3C1C0EAC7C6E7C4C3E9C6C5E2BDBCECC7C6E1BEBCE3
+ BFBDE8C2C0EBC4C1E9C1BFE9C6C4E6C2C0EAC4C2E9C3C1EBC5C3EAC4C2F4CBC8
+ E2BEBCEBC5C3F3D0CEFCDAD7EDC8C5E8C2BFEDC6C4EDC4C2F0C9C7E1BEBCE4C2
+ C0E9C6C4E9C8C6E7C4C2E3C0C0F2CFCEEDCBC9E0BEBDE1BFBDE0BFBCDBBAB8E2
+ C0BED8B7B5E9C8C6E5C4C2DDBCBBDFC0BEDDBEBDE6C8C6EFD2D0D8BCBADFC3C1
+ ECD1D0ECD1D0E8CCCBD9BDBBE3C7C5D4B8B6E2C7C5DEC3C3E0C6C5DAC2C1EBD4
+ D2E2CAC9DEC6C5E5CDCCDAC5C4DFCACAE0CDCDDFCDCDEAD8D8E9D7D7DFCBCBDF
+ CBCBDDC8C8EDD8D7E4CFCFDBC7C7DBC8C6E1CECEEDDADAECDBDBDFCECDE4D3D3
+ EAD9D8E6D3D2D0BCBBECD7D7F6E2E1E8D5D4D3C0BFD7C3C2DDCAC9F5E3E2F6E3
+ E2DECCCBDBCAC9D9C7C6E4D2D1DECCCCDDCCCCDBC9C9D8C6C5EAD7D670686700
+ 0000786F6EEFDBD9D6C3C2DCC9C8D9C6C5E1CDCDF7E4E2EDD9D8D6C2C0DAC6C5
+ E1CCCCD7C4C3E4D1D0DBC7C6DAC7C6E8D4D4DAC7C6DAC7C6E1CECDE4D0CFDDC9
+ C8DECACAE1CCCCE4D0CFE1CCCBE8D4D3D8C4C3E9D5D5E9D5D4ECD7D6E7D2D1ED
+ D7D5EBD6D4E4CECED4BEBDEDD7D6E2CBCADFC8C6DFC7C6E3CBCAE9D0D0DDC4C3
+ E7CECDE1C8C6EED4D3EBD2D0DDC4C3E0C6C6E5CBCAE2C9C7E3C9C8ECD2D0DFC4
+ C3E5CAC9E3CAC9E4CAC9E5C8C8EACCCBE0C5C4E9CFCEE5C8C7F0D1D0DDBDBBEE
+ CDCCEDCBC8E8C4C3E9C4C3A18B8AA9908EECCBC9A28C8B9C8686E3C1C0D2B3B3
+ C0A3A1F2CCCBE2BCBBECC6C5E4BFBDEEC9C8AB8F8DE6BEBBB79795D1B2B0E8C3
+ C1EAC2C0BFA09EBFA19FD5B0ADAE8E8DE2BDBBB19694C9ABA9A68E8DB4989699
+ 7F7ECAA7A59B807FA88C8BE5C1BFDDBDBB957E7DD7B7B6A08685E5C2C0B99E9C
+ AD9391C7A8A6EDCAC8EACAC8DBBBB9E9C7C5DDBCB9F2D0CEE5C4C2E6C7C5E5C6
+ C4E2C3C1F1D3D1EDD0CEDDC0BEDDC1C0EFD4D3F2D7D6DFC4C2DEC2C1F7DBD9D9
+ BDBCE5C9C8D7BDBBF1D9D7E1CAC9E5CECDE0C9C8E6CFCEE2CCCBE1CCCCE8D5D5
+ E8D6D5DECCCBEDDAD9E5D2D1DAC6C5ECD7D6DEC9C9E5D0D0DFCBCAEDD9D8E3CF
+ CEDECBCAEDDBDBE5D3D3DAC9C8E9D7D7E6D4D4EBD9D9D7C3C2F3DEDEF1DDDCDD
+ CAC9D6C2C1E9D6D4D2BFBEEBD8D7F1DFDED3C0BFEFDCDBE5D3D2DBC9C9DECCCC
+ E5D4D3D4C2C1EAD8D7F1DFDE6F67670000006A6160DFCBC9EEDBD9D4C1C0D4C1
+ C0D2BFBEDDC9C8D5C1C1E1CDCBDCC7C6D9C4C4D7C4C3D9C4C3E2CECCD9C5C4DF
+ CCCBD9C7C6DBC8C7DFCBCBE4D0D0D9C5C4E4D0CFDDC8C8DAC6C5DFCBC9E1CDCB
+ D6C2C1E8D4D4E8D5D4EDD9D8E3CFCDECD6D6EBD5D4ECD5D4DCC6C4E0C9C8DDC7
+ C6E1C9C9DDC5C4DCC4C2E2CAC8D9C1C0E0C7C5DAC1C0DEC5C4E4CAC9DDC4C3DE
+ C4C3DEC5C4E6CCCBDDC4C3DFC5C3E1C5C4E1C6C5E5CAC9E4CAC9E3C7C6E8CACA
+ DFC1C0E5C9C7E0C5C3EACBC9DBBCBBEBCAC9ECC9C7ECC9C7E3BEBCAD92909F88
+ 87A18987877473947F7E8E7878C4A6A5897372F4CCCAE3BCBBEDC5C3E7C0BEDA
+ B6B4403534BE9C9A62504F7F6B69F2CBC9EEC4C29379788B7472CCA7A57B6463
+ CAA8A5786462796564C4A5A48D7574866E6C786261977B7A816B6AA48B8A9B83
+ 827864638772717F6968D0AFADC5A8A69C84827B6766EBC7C5E1C1BEDCBAB8E5
+ C3C1DAB8B7E6C3C1DFBEBDE2C2C0E4C4C2DBBCBADEC0BEDCBEBCE5C8C6DFC3C2
+ E8CDCCF3D8D7E6CAC9DABDBBE5C9C8DBBFBEE8CECCD9C0BFECD3D3DEC6C5E6CE
+ CDDFC8C7E1CBCBE4D0CFDDCACAEBD8D8DFCCCCE1CDCCEDD9D9E7D2D1DCC7C6DE
+ CAC8D8C4C3E0CBCADCC7C6EBD8D7DECAC9E0CDCCEDDBDAE6D4D4DBCAC9E0CFCE
+ DECCCCE4D2D3DAC8C7F2E0DFF3E0DFE9D7D5D8C5C5E0CDCDDAC8C7EBD9D8EDDB
+ DBDBC9C9E1CFCFE1D0CFE1D0CFD7C6C5E6D5D4E0CFCEDFCECEECDAD9766D6D00
+ 00006D6363F4E0DFF1DEDDECD9D8DBC8C7E0CDCCF2DEDCECD9D7EFDBD9EAD5D4
+ E3CECDECD8D7E3CECDF0DBDAE5D1D0E7D4D3E7D3D3DAC6C5E1CECDE7D3D3D7C3
+ C2EDD8D7E5D2D1E1CCCBE9D4D3EAD5D5E8D3D3EAD6D6E2CECDE8D5D4E6D1D0E9
+ D4D3E9D4D4E9D3D2EAD4D2E5CECDE6D0CFE9D2D1E3CCCBE7D0CFE6CECDE3CBC9
+ E5CBCBE0C7C6E3CAC8E8CECDE9D0CFE8CECDE3C8C7EFD5D4E8CFCEE8CECDEFD3
+ D2ECD0CFEED1D0E4C8C7E2C7C6E9CECCDEBFBDEACAC8EACDCBE9CDCAEBCDCBEE
+ CCCAEECDCAF2CFCDF0CBC9CCACAA9E8887B19896907B7AE0C0BF5A4D4CC6A7A6
+ 816C6BFAD0CFEBC4C2EDC4C2F6CDCBB19493796463A28785625050B89897D0B0
+ AFFACFCDBA9A99A38786ECC2C07E6766CFADAB8F7877A68C8BCBABA9CAA8A595
+ 7A78967B7AA88A88BA9B9A665655806C6A9E8483A38986917978DCB9B7BB9E9C
+ 5C4D4CC4A5A4EFCCCAE9C6C4EBC7C5EFCCCAEAC8C6EFCDCAEAC9C7EACAC8EFCF
+ CDECCDCBEBCCCAE8CAC8EDCFCEECCFCEF0D4D3F1D4D3F0D3D2ECCFCEE9CDCBEB
+ D1CFE7CECDEAD1D0EDD3D2EAD1D0EDD5D4EAD4D3EBD6D6EDDADAE8D4D4ECD7D7
+ E7D3D2ECD7D7EED8D9F0DAD9ECD6D5E3CECDE5CFCFEAD5D4EBD6D6F1DDDCE9D6
+ D5EBD9D8F1DEDEEDDBDAE9D7D7E7D6D6E5D5D4E6D5D5E5D3D2EBDAD9E7D5D5F0
+ DEDDE6D3D2E7D5D4ECD9D8F3E1E0F4E3E2E6D5D4E7D5D5EDDCDBECDADAE9D8D7
+ EEDDDCE6D5D4EBDAD9F9E7E6786F6E000000736969FFEDECEAD7D6F3E1DFE4D2
+ D0E5D1D0F5E2E1F5E2E0F0DCDAF2DEDCE7D3D1F3DFDDE4CFCEECD7D6EDD9D8EF
+ DBDBEDD9D8DFCBCAD9C5C5DBC7C7DAC6C5EAD7D6EBD6D5E8D3D2E9D4D3E7D3D2
+ EDD8D9EED9D9E8D2D2E8D3D3E0CBCBE4CFCDE1CCCBE4CECEE8D2D1E8D1CFE9D2
+ D1EAD4D2E9D2D0EBD4D2EDD5D4EBD2D1EAD1CFEAD0CFE5CCCAEAD0CFECD1D0ED
+ D2D1EFD3D3F1D6D4E9CECDE9CECEEDD2D1EBCFCDEFD2D1EACCCBDDBFBEDEC2C0
+ E0C3C2EAC9C8EECCCAEBCDCBEBCCCAEECCCAEDCBC9F2CFCCF6D1CFAF94935C4E
+ 4DCAADAC96807FAB91909C8483A08786816C6BAB8E8DF4CAC8EBC1BEF8CBC988
+ 7170AC8E8DB19290715B5BF4C8C6A68B89F6CBC9C09F9E87706FD5AEAD796260
+ 997F7D8D7574EDCCC8B79896AA8D8B7C6564DCB3B1987E7C9C8382B899978C75
+ 74846E6CD5B1AF927B78DBB7B5846F6D8C7675AF9493EBC8C6E8C2C0EAC7C5F1
+ CECBF2CECCE9C6C4EDCBC9E8C7C5EACAC8EBCCCBF0D1D0ECCFCEEBCFCEE8CBCA
+ ECCECDE9CDCCECCFCDEED1CFEED2D0F3D9D7E6CCCBEACFCEE3C9C9E7CFCEEAD4
+ D3EED9D8EDD8D7ECD8D6ECD8D7ECD7D5ECD7D5EED8D7EFD9D8EFD8D8F1DADAEA
+ D4D4EAD5D4E2CDCCE6D1D1E9D4D4E5D2D1E6D3D3ECD9D9EAD8D8E9D8D7EADADA
+ E8D7D8E1CFD0DDCBCBEBD9D7E5D3D2EFDDDCEBD8D8EDDCDBEBDAD8EFDEDCF0DF
+ DDE7D6D4E5D4D3D9C7C7E7D6D5F0DEDEEEDDDCE3D2D1E1CECDE5D1D0766D6C00
+ 00007B7171FFEFEEEDDBD9F2DFDDEAD6D5E1CDCCF0DDDCF2DFDDECD7D6EDD9D8
+ E8D4D3EDD9D8E7D2D1E8D3D2DFCBC9E8D4D4EAD5D4E0CCCBDFCBCAE4D0CFE8D4
+ D3E9D5D5E7D2D1E8D3D2E9D5D4E6D2D2EBD7D6EED9D9ECD7D6EFDBDAEFD9D9E8
+ D1D0EDD6D5EAD4D2EBD6D4E8D2D0E8D0CFE8D0CEEAD1D0E7CECDEFD5D5ECD3D2
+ EBD3D2EED4D2EBD0CFEED3D1EFD3D3EBCFCDE7CBC9F1D5D3E8CCCBE3C7C6EDD1
+ D0EBCECDEDD0CEEFD0CEE9C9C7E9CAC8EDCFCEECCECCEBC9C6EBC9C7E6C6C3EB
+ CAC9E6C4C2EAC6C4EEC9C7D8B6B57C6867E1BFBDECCAC8E2C0BDF2CDCBE8C3C1
+ E9C2BFE0BAB8F4CAC8F4C7C5F2C5C2685655E1BAB7987D7C5A4948F0C5C2B699
+ 97D3ACAAEABFBDD3AEACEBBDBAE6B8B5E3BBB9EAC2C0F6D1CDEFC4C2D9B2B082
+ 6A68EBBEBBE9BFBCE1BBB9F1C8C5E4BDBBE4BDBAECC4C1E6C1BEE4BEBCE2BBB9
+ E7C3C0E0BEBCEFC9C6E9C4C0EFCAC7F1CDCAF3CECCECC9C7ECCAC9EDCCCBEDCC
+ CBEECFCEEED0CFEACCCBE9CBCAE9CCCAEDD0CFECCFCDF2D5D3F3D6D4EFD3D1F2
+ D5D4ECD0CFEFD4D3ECD3D2ECD6D5EBD6D5EDD7D5EBD4D2E9D2D1E5CFCFE7D1CF
+ E7D0CFEAD2D1EED7D6ECD5D4EBD5D4E9D3D2EED7D7EBD6D6EDD7D7EDD9D9EAD6
+ D6E8D5D4ECD9D8E9D7D7EBDADAECDBDBECDBDBE5D4D3E5D3D2ECDADAE6D4D3F1
+ DEDDF1DEDEF0DEDDECDAD9EDDBDAF3E0E0E9D7D6E6D5D4E2D0CFEAD9D8E3D2D1
+ E7D5D5F0DFDDE8D6D5EEDBD9746B6B0000007C7272FEEDECF1DFDEF3E1DFF0DD
+ DBEED9D8E8D5D3EAD6D5EFDBDAEFDBDAEDDAD9F2DEDDECD8D7F5E1DFEFDBD9EF
+ DCDAEFDBDAF1DCDBE1CECCE6D1D0F0DBDAEFD9D9EBD6D5E8D3D3E6D1D1E4D0D0
+ E8D3D3EBD5D6E8D3D2F0DBDBF0DADADFC8C7EDD6D5EED7D6EED8D6EBD4D3E8D1
+ D0E7CFCDEBD2D1E4CCCAEDD5D3E9D1D0E8CFCEECD3D2E7CDCBEACFCDF0D4D2ED
+ D0CFEACDCBF1D3D2EFD1D0E8CBCBEDD0CFEED1D0E2C4C2E8C9C7E6C6C4EBCAC9
+ EFCFCDEFD1CFECCDCBEDC8C6ECC9C6EFCFCDE4C2C0E2BDBBE3BEBCF4CCCAAC8F
+ 8ECDABAAE8C4C2F1CBC9EDC7C4F2CCCAF3C9C6F5CAC7F6CAC7F6C8C5D1A8A554
+ 4544ECC2BF5E4C4B9E7F7D9B7F7DE3BDBB967B79ECC1BEC9A6A3F1C2C0F5C4C1
+ F0C4C1EFC6C3F0C9C6F1C4C1F5C6C4836967D7ADAAEFC4C2ECC4C2ECC3C1EBC3
+ C0ECC2C0EAC2BFEDC5C3EAC1BFECC4C1F2CECBF2CBC9F3CDCAF2CDCAF1CAC8F6
+ D0CDF7D1CFF4CFCEF0CECBEFCDCCECCCCAF0D1D0F3D5D3EECFCEF0D1D0F0D3D1
+ F1D5D3ECCFCDEFD2D0F2D6D3E3C7C4E0C4C3E2C7C6EAD2D0E9D3D2EBD5D4ECD5
+ D4EED6D5F2DAD9F3DBDAF1DAD9F3DBD9F1D9D8EFD8D6F2DBDAF0D9D8EED7D6ED
+ D6D5F1DBDAEBD5D4F1DBDAF3DFDFEAD7D7EBD7D7EFDCDCE8D6D6E9D7D8ECDADB
+ EBDBDBE7D5D4E7D5D4EBD9D8E7D4D3EEDCDBEEDCDBF1DFDEEEDCDBF0DEDEF2E0
+ DFEDDCDBF2E0E0F1DFDEF3E2E1E7D5D4F2DFDEF9E5E4F8E5E4FFEFEE766D6C00
+ 0000766C6BF8E4E3F4E0DFF3DFDEE2CFCDE5D1CFDFCBC9DBC7C7E4D0CFF2DFDE
+ E5D1D0EDDAD9E1CECDE7D3D1E5D0CFE2CFCEEAD6D4EAD6D5DAC5C5DBC7C6E6D2
+ D1E8D3D2F0DAD9E4CFCFECD7D7E1CCCDE3CECEEDD9D8E5D0D0E2CDCCECD6D5D9
+ C2C2E6CFCDE7CFCEE8D1D1EDD5D4E2CCCBEAD2D1E6CDCCDFC7C6E2CAC9E2CAC9
+ E8CFCEE5CCCAECD3D1E4C9C7E9CDCBF2D6D4ECD0CFE5C8C6EACDCBEBCDCCE1C3
+ C2E6C8C6DEBFBDE6C8C6E3C4C2DEBDBBE8C6C4E4C2C0EAC9C7EAC9C7E5C0BEEF
+ CBC9E9C8C6E7C3C1DEB8B5E7C0BDE9C2BF9B7F7EC5A2A0F0CAC8E5BDBBEEC6C4
+ E9BFBCE4B8B5E7B9B6EDBEBBB58F8D8C6F6DDAB2AF8A6E6CBE9492997876DBB4
+ B2987A79CFA7A4F3C4C2EFBDBAF5C3C0ECBFBCEEC5C1E8BFBCEABBB9F2C3C099
+ 7977D6ACA9F2C8C6EDC4C2ECC4C1E5BBB8E3B9B7E4BCB9E9C0BDE8BEBCE0BAB8
+ E6BFBDEDC6C3EBC4C1E6BEBCF0C9C6E6BFBDEAC5C2E5C2BFEBC7C6EFCDCBEDCD
+ CAE3C3C2E5C4C3EBCCCAE3C3C2E7CAC9EACDCCE9CBCAE4C6C4EDCFCDEDD0CEEA
+ CFCDDDC5C4E5D0CEECD5D3ECD4D3E8D0CEE3CBCAE9D0CFEDD5D3E6CDCBE6CDCB
+ ECD3D2EDD6D4E9D1D0E6CFCEEDD5D4E7D1D0E7D1D0DFC8C8E0CBCAEED9D9E0CC
+ CCE7D4D3E8D6D6E8D5D5E3D2D1EBD9D9E5D3D3EAD7D5EDDBDAF0DEDCE2CFCEE6
+ D3D2EDDBDAE6D4D3E1CECEE3D1D0F3E1E0E4D2D2E3D1D0EBD9D9F1DFDEDBC8C7
+ E5D2D0E9D7D5EAD8D7F6E4E36F66660000007C7372FFEAE9F5E2E1D8C5C4DDC9
+ C7DECBC9DDCAC8DFCBCAD4C1BFEBD8D6D5C0BFE5D1CFDAC6C5EDD9D6E3CECCD3
+ BEBDDECBCADECBCADECBC9DCC8C7E1CCCCDAC5C4E6D1D1DEC9C9E9D4D4DDC9C9
+ E1CDCCE1CDCCE5D1D0DEC9C7ECD6D5DCC6C5E9D2D2EAD2D1EAD2D1E5CDCCD8BF
+ BEEAD2D1E3CBCADDC4C4E0C8C7DCC4C2DFC6C5E4CAC9E0C6C4DEC4C2DCC1C0E2
+ C6C4DEC1BFE3C6C4DFC1BFEACCCADBBCBAEACBC9DFC0BFE9C9C7E5C5C3E1C0BE
+ E9C6C4DAB4B2E7C2BFDEBEBCE0BFBDE2BCBAE6C2C0E0BEBCE4BEBCEBC3C1F1C8
+ C5EDC1BFDEB1AFEBC1BFE0B8B5EDC3C0E3B9B6EEC2BFDFB0ADF1C1BDE8B4B1F6
+ C1BDFACAC7FCCAC6E4B0ADF7C0BCF5C7C4F1BEBBEEBDBAE4B7B4E8B4B2E9B6B3
+ E1B2AFE3BAB7E5B9B6EABAB7F2C1BDE6B2AFE3B5B2F0C5C2F1C6C3E9BEBBE3B6
+ B4E9BEBCDFB6B3EDC1BEE2BAB7E6BFBCE1B8B5ECC3C0E6BDBADDB3B0EBC3C1E4
+ BDBBE1BBB9E6C1BFE0BDBBEFCECCF0D0CEE1C0BEE1C0BFECCDCBE1C3C2E6CAC8
+ E3C6C4E2C2C0E0C1C0E5C8C7E4CBC9DEC6C4E4CCCBE9D2D0EED6D5DDC5C4CBB4
+ B3E4CAC9DEC4C3E8CFCDDDC4C2E7CECCDEC6C4EDD5D4DAC2C1DAC3C1E5CECDDD
+ C6C5E9D3D2D8C3C3E6D2D0E1CCCCDFCBCAE1CECDDECBCBE6D3D3DECCCCEAD8D7
+ DBC7C6E7D5D4EFDCDBF1DEDCD8C4C3E4D1D0DECBCAE4D1D0DCC9C8DBC8C7EBD8
+ D7D9C6C7E1D0CEDDCACAECDADAD4C2C0ECD9D8D9C7C6E2D0D0E8D5D469606000
+ 00007D7272F4DFDEF0DEDCD0BDBBDFCBC9E0CDCCE0CDCCE0CCCBDECBCAECD8D7
+ D7C3C2E7D4D3DECBCAEBD7D6EDD9D8D4BFBDDAC5C4ECD9D8E4D0CFE0CCCCEBD7
+ D6D9C5C5DDCAC9E3CFCEE2CDCDDECAC9EAD5D4DDC8C8E1CCCBE0CBCAEBD6D5DB
+ C5C4ECD6D4F2DBDAEAD2D2DDC4C3E0C7C6E4CCCAE3CAC9E2C9C8E5CCCBDAC2C0
+ E0C6C5EFD4D3DEC3C2ECD1CFE3C8C6DEC2C0DDC1BFEED1CFDEBEBCE4C4C2DBBB
+ B9EBCCCADFBFBDE5C5C4E2C2C0E6C5C3EFCCCADCB7B5E8C2BFE1BDBBEBC9C7DE
+ BCB9DEB7B5ECC7C5EAC7C5E8C2BFEFC6C3EBC0BDDEB0AEE2B4B1E5BCB9ECC0BD
+ E1B5B2F2C5C2E1B1AEF4C2BFE2AFACEFBAB7F7C5C2F2C1BDE1ADA9EAB3AFEEBE
+ BAE5B3B0EDBBB8E8BAB7EFBAB7EAB6B3E8B8B5EBC1BEE5B7B4EEBCB9ECB7B4E0
+ AEAAE1B4B1EBBFBCF3C6C3E5B7B4E3B5B3EDC1BFE0B3B1EEC3C0DEB6B4EEC2C0
+ E6BAB7EABFBCE9BDBAE0B4B2E5BCBAE3BCB9E9C2C0EDC9C7DEBCBAF0CDCCF0CE
+ CDE4C3C2E6C7C5ECCFCDE3C7C5E5C9C7E7C8C6EDCECCE5C9C8DEC3C2DCC4C3EC
+ D3D1E8CECCE3CAC8EFD5D4C6B0B07A6C6BC6B1B0E2C8C7E3CAC8E0C7C4EED5D3
+ DDC4C2EDD3D1DFC6C5E6CDCCE9D2D1E0C9C9EFDBD9DDC9C8EAD6D6DDC8C8E7D3
+ D3E3D0CFE1CDCDEDD9D9E0CDCDECD9D8DDC9C8EAD8D7EEDAD9F0DBDAD8C4C3E8
+ D5D4DDCAC9ECD9D8E3D1D0DECBCBE1CECDDBC8C7EDDBDAD5C3C2E2D0CFD5C2C0
+ EDDBDAD9C7C5EBD9D8E9D7D66A6261000000786F6EEFDAD9E9D7D5E2CECDDCC9
+ C8DECCCBE6D4D3E4D2D1DBC9C8E4D3D2DACAC9E6D5D4DECCCCDFCDCDE1CFCEDE
+ CBCAE2CDCCDAC5C4E8D3D2DBC7C6E1CDCDE1CFCEE0CDCCE2CFCEE0CCCCDECAC9
+ E8D3D3DDC9C8E3CECEDDC8C8E2CCCBDBC4C4E7D0CFF1DAD9E5CDCCDAC3C2EAD1
+ D0E1C9C8DFC6C4DFC5C4E0C6C5E3C9C8DAC0BFE4C9C8E6CBC9DFC3C2DCC0BFF0
+ D3D1E1C5C3E1C3C2E3C4C2E2C2C0DABAB9E0C0BEDEBDBBE6C5C3DCBBB9E7C5C3
+ E7C4C2DBB7B5EDC7C6E3BEBCE3BEBCE4C1BFE7C3C0E5BBB9E0BAB7E3BFBCF3C9
+ C5E9BDBBE0B3B0EABBB8DFB1AEF2C7C3E7B9B6E8BBB8E2B0ADEAB6B3E1ADAAEE
+ B7B4F8C3C0F5C3C0E3AEAAE2A9A5E8B4B0E4B1ADEAB6B2E6B6B3E8B1AEE6B1AE
+ E5B5B1E8BDB9E3B2AEE7B3AFE5AEABE7B4B0E4B6B3E8B9B6F4C5C3EFBFBCE4B6
+ B3E6B8B5E1B2B0E7BCBAE0B3B0F1C3C1E2B7B3EABEBBE6B9B6E5B9B6F1C7C5E0
+ B9B6EDC7C5E4C0BEE9C5C3F8D4D1EDCBC9E0BFBEE2C3C2E4C7C5E3C5C4EBCCCA
+ E3C5C4ECD1D0E3CAC8EAD1CFEDD2D0EACECCE1C5C3E5C9C8EBD0CEEED3D2EBCF
+ CD948281B49F9EE4C8C7E2C7C6ECD1CFDEC3C1E2C8C6E2C9C7E5CCCBE7CFCEDF
+ C8C8E2CDCDDDC8C8EBD7D6DDC8C8E3CECDEDD8D7DECAC9DFCBCBDDC9C8E4D0CF
+ DECBCAF3DFDEF8E4E2E7D1D0D5BFBFE3CFCFE5D3D3DFCDCDDECCCBDDCBCADAC7
+ C6E1CFCFE9D7D6D8C7C6E1CECDD2C0BEE3D1D0E0CECCDECCCAE7D4D46C646300
+ 0000736968FAE6E4E5D2D0F4E0DEEEDCDBEDDCDBEEDDDBECDBDAE5D5D5E3D3D3
+ E9D9D9EBDBDBE5D4D3ECDCDBE8D6D6E6D4D4E6D2D1E3CECDE5D0CFE5D1D0E4D1
+ D0E8D5D4E9D5D5E9D6D5E0CCCCE2CECDE8D3D2DECAC9EFDAD9EED9D8EDD6D5EE
+ D7D5ECD4D3EED6D6EBD2D1EBD4D2ECD4D3EAD2D2E8CFCEE5CBCAE5CAC9EED2D1
+ E9CECBECD0CEF3D7D5EDD0CEE6C9C7F0D3D1E4C7C6EBCECCECCFCDEED0CDEDCE
+ CCE7C7C5EECCCAEECCCAEDCAC8EAC8C5E5C3C2E5C3C1E7C3C1EAC6C4E9C4C1EB
+ C4C2ECC9C7EAC4C2E9BEBCEBC4C1F2CCC9EEC3C0EBBDBAF2C2BFE1AEABE8BAB7
+ EBBDBAEDBEBBF3C2BEF0BBB8F0BAB7EFB8B5F1BAB7F6C4C0EEB8B5EFB4B0F2BB
+ B8EEBCB8ECB6B2F3C0BCE9B0ACEDB6B2EDBCB7ECBFBBEEBAB6EDB6B3EFB7B4F0
+ BDBAF0C1BDF0C0BCF0BEBBF0BFBCF1C2BEF0BFBBF2C4C1E9BCB9EEBFBCF0C4C1
+ EEC0BDEBBEBCDBB2AFD9B1AEF2C8C5ECC3C1EBC5C3E8C2C0DFBDBCDFBFBDDFBF
+ BEE9CACAEACBCAEECDCCE9CAC8C5ACABDFC7C5EED5D4F4DAD8E8CECCBEA8A6BB
+ A4A3D1B7B5EACECCEED2D0E8CCCAEED0CE8474736F6261F9DCDBE5CBC9DAC2C0
+ D2BAB8D8C1BFD5BFBDC9B3B1E2CCCAEAD3D3E8D4D3F1DBDBEFD9D9CEBCBBCDBA
+ BADAC6C6EDD8D7ECD7D7EED9D9F0DADADFCBCAD8C5C3DBC8C7E6D1D1E8D5D4EB
+ D8D8EFDCDCEEDCDBEFDEDDECDBDBE9D8D8EDDCDBE8D6D6E6D6D5F3E2E0EFDDDB
+ ECDBD9F2E0DFECDBD9FAE8E7756D6C000000766C6CF9EAE8E6D4D2EEDBDAF1E0
+ DFEEDEDDEBDAD9EEDEDDEBDCDBE9D8D8EADBDAEAD9D9EBDAD9EAD9D8EAD9D8EA
+ D8D7E5D4D3E8D4D3E5D1D0EBD8D6EBD7D7E8D4D3EAD7D6ECD8D8E8D4D3DECAC9
+ DBC7C6E4CECDF1DCDBF1DDDBF0D9D8EFD7D6EDD5D4ECD3D2E4CBCAEAD2D1E9D1
+ D0EBD3D2E9D1D0EAD0CFEACECDEED2D1E9CCCBEED0CFF0D3D1EED1D0EACECCF2
+ D5D4E5C9C7E0C2C0DEC0BFF1D3D2F5D7D5EFCFCCF2D1CFF0CECCF1CECDEBC9C6
+ E7C4C2E9C6C4E7C3C1EAC5C3EAC4C2E9C2C0ECC4C2EEC9C6EDC6C3EBBFBCEFC7
+ C5F0C7C4F1C4C0F4C4C1EFBCB9EDB9B6EDBFBCF0BFBBF4C3BFF0BCB8F5BEBAF1
+ B8B5EDB3AFF3BEBAF3BDBAF1B6B2F1B8B4F0BCB9F1B9B4F5C2BEF2B7B3F4BBB7
+ F1C0BCEDBFBBF0B9B6F0B6B3F0B7B3EBBAB6F1BFBCF4C2BEF5C1BDF1BFBCF2BF
+ BCF4C2BEF4C6C3ECBCB9F1C2BEF2C3C0F5C5C2D9AFAD463938876F6DE7BFBCE8
+ BEBBEEC6C3F2C9C7987F7E1F1B1BBBA2A0EDCCCAF3D1CFCEB1B05F5453AB9997
+ ECD1D0F6DAD9B29D9D49403F897876C7AFAEC0A8A7AE9998DEC4C2F3D6D4ECCE
+ CC7C6B6A6F6261FFE5E4DCC4C24B43425A514FAD9B9AAA98977C6F6E605756E8
+ D2D1FBE5E4C6B4B4857978948686A697979185847A6F6EEAD5D4F0DAD9F0DAD9
+ C8B5B4423C3B5E5454E2CFCEF2DEDDEEDBDBE6D4D4EDDBDBF2E0DFEEDDDDEADA
+ D9EAD8D8E9D8D7E6D5D4F1DEDCF0DEDDEEDDDBF1DFDEF1DFDEFBEBEA78707000
+ 0000776E6DFFF3F1F1DDDCEEDBDBE9D8D8EEDDDCEDDCDBEADADAECDDDCECDCDB
+ EDDCDCE5D5D5E9D8D8E9D8D8E9D8D8E7D6D6E9D8D7EAD8D8E3D0D0EBD7D6EDD9
+ D9EBD7D6EDD9D8EDD9D9EDD9D8F0DBDAECD6D5E9D3D3ECD7D7F0DBDAF1DBD9F0
+ DAD8EFD8D7F0D8D7E9D1D1EED5D4EBD2D1EAD0D0ECD1D1E8CECDE8CCCBF2D7D5
+ E9CCCBE7C9C8F1D4D3ECCFCEE7CAC9EFD3D1EACCCBECCECCEFD1CFEBCCCBF0D2
+ D0F1D3D1F0D0CEEFCDCCF0CDCCECCAC7EBC7C5E7C3C2E7C2C0EBC5C3E9C5C2E9
+ C2C0EBC3C0EDC3C0EDC5C3EBC1BEEDBEBCF0C7C4EBC0BCEFBEBBF1BFBBEDB7B4
+ ECB9B6F0C0BCF2BFBCF0BCB9F2B9B5F2B8B4F1B5B1F2B8B5F0BAB6F1B4B0F3B4
+ B0F1BBB8F2B7B3F1BBB7F0B3AFF1B7B3F4C2BEEFBEBAEFB6B2EFB2AEF0B7B3EC
+ B9B6EEBAB7F2BDBAF8C3BFF6C3BFF1BBB8F3C3C0F5C4C1F0C0BCF2C2BEF1C0BD
+ F4C4C2F7C7C45B4948B89896FFD4D1EBC1BEF1C8C5EEC4C2DDB9B73C3333E8C5
+ C3F3CFCCD7BAB8342E2DA28F8EF9DAD9F5D7D5BDA5A5282222BEA7A5FDDDDBF4
+ D5D3F9DBD9E5C9C78F7D7CE2C7C6F8DAD8806F6E726463FDDFDEFEE1DF706463
+ 8F807FFFEAE8F7DDDBFCE3E1A39392D1BCBBC8B5B5453F3FC5B3B2F9E3E2F8E2
+ E1FAE4E38B7F7FD0BDBDF7E2E0F1DBDAFFE9E7756A69817575FBE5E4F0DCDCEE
+ DCDCEEDCDBE9D8D7EDDCDBEFDEDDF0DFDFF3E1E1F1DFDEEEDCDBF7E4E2F0DDDC
+ F0DEDDF2E0DFF3E1E0FFF0EE7971710000007B7170FFF4F3EFDBDAECDAD9EFDF
+ DEEDDCDBF0DFDEECDCDCECDCDCEEDEDEEFDFDFEEDDDCEDDCDBEDDDDCDFCCCCD9
+ C8C8E7D6D6EDDBDAE5D3D2E9D7D6EBD7D7EAD7D6E9D5D4EBD6D6E6D2D1EBD6D5
+ EDD7D7E8D2D2E9D2D2EED8D7E9D2D1EED7D5F4DDDBF3DCDBEFD7D6F1D9D8F4DB
+ DAF2D8D7EDD2D0DFC3C1DFC2C1E4C7C6EDD0CFECCFCEF4D8D7F2D5D4EFD0CFF1
+ D2D0E8C9C7EDCECCF2D3D2EECFCDEDCECCECCBCAEDCECCEFD0CDF2D1CFEECCCA
+ EDC8C6E9C4C1E8C3C0EFC7C5ECC4C1EDC5C3EDC5C3ECC1BFEDC1BFEFC6C4EEC3
+ C0E9B9B6E1B7B5E3B4B1EEBAB7EFBAB7EBB3AFF1BEBBF0BBB8F3BFBCEFB7B3F1
+ B5B1F2B3AFEEB0ACE6AEA9EEB1ACF2B0ACF2BAB6F3B6B2F1BAB6E4A4A0EBB0AB
+ F5C4C0F3BFBAEEB1ACF1B0ACF4BCB8EFBCB7F0BAB5EEB7B3F1BCB9F1BBB7F0BC
+ B8F0BEBBE9B5B2E3B1ADE8B5B2E2B0ADF3C3C0F6C7C4594847A58987E6BEBBE4
+ BDBAFCD2CFECC4C1D8B5B2413736ECC8C6F3D2D14C4443827170F2D3D0E4C4C2
+ F1D0CF4C4342877675FFDEDDEED0CEEDCECCEED0CEFCDCDA958281958382FFE9
+ E78A7978706261FEE2E0FFE4E27366658B7C7BFFE3E2F1D7D7F2DAD9F2DAD9EC
+ D4D3554C4DA89897F9E2E1ECD6D5EDD8D7F0DBDAEFD9D8EFDAD9F3DDDCF5DFDD
+ FEE9E7746A69857A79FDE9E8F3DFDEEFDCDBE8D6D6D8C7C7E3D2D2EEDCDCE9D9
+ D8EEDDDDF1DEDEEAD7D6EDDAD9F0DDDCF1DEDDEBD9D8E6D4D2FDEAE8766D6D00
+ 00007E7573FBECEBE1CECDE2D1D0EBDAD9DFCFCEE4D5D4EADBDAE4D4D4E9D9D9
+ E0CFCEE1D1D0E0CFCFEEDDDDE1D0D0DECDCCE7D6D6E0CECEE0CFCEE7D4D4DFCC
+ CBE1CDCDE8D4D4ECD7D7E1CCCCDDC8C8E6D1D0ECD7D6E2CCCCE3CCCBE0C8C8ED
+ D5D4E3CBCAE5CDCDE5CECDE1C9C8E3CBCAE4CAC9F1D6D4EDD0CFDDC0BFDABCBA
+ EDD0CFEACDCCE6CAC9E2C5C3E7CAC8EBCCCAE0C0BEE0BFBDEBCAC9EAC9C7DEBE
+ BCE3C2C1DCBBB9E5C5C2EACAC8E2C1BFEBC8C6ECC7C5E7C0BEE1B9B6E3BAB7EA
+ C1BFE7BEBBEDC3C0E6B9B7E7B9B6E7BEBBEEC3BFEAB9B6E0B5B2E9B8B4F4BEBA
+ EEB5B1E9AFABE7B3AFECB6B2F4BDB8F4B6B2F3B3AEEFACA7E7ACA7F3B5B1EBA5
+ A1EBB1ACEEAFAAF3BAB5E7A39EF0B3ADEEBEB9EAB1ADEBAAA5F6B4B0EEB7B3EA
+ B3AFF4BAB6EEB5B1E8B0ADF4BCB8E8B6B1E7B2AEEBB7B4E6B1AEEDB9B5E2B0AD
+ EDBDB9EFC1BE55454476605EA58684826B69B09492F0C6C3D4AFAC3D3433BCA3
+ A16E6160514646FAD8D6E7C6C3E0BDBCD7B9B7332D2CD9BCBBE7C8C6E5C5C4E3
+ C3C1DEC0BEF2D3D2A993925F5251FEE3E18C7C7A675958EED1CFF5D8D66B5E5D
+ 726362DAC0BFCFB8B7877978D5BEBED9C2C23E3837E3CCCBE3CCCBDCC6C5E2CC
+ CBDDC8C7E9D4D3E9D4D3E0CAC9F4DEDDEDD7D66A605F857978F6E1E0E1CECCE2
+ CFCDEBD8D7DCCACADDCACBE5D3D3DECDCDEAD9D9E1CECDDECAC9D9C5C3EBD7D6
+ E6D3D2E2D0CFEAD8D6E8D5D46C63630000006E6564E1CCCAE1CFCEDFCECDD9C8
+ C8D8C8C7E5D5D5DECFCFDFCFCFE2D1D1E2D1D1DCCBCADAC9C8EAD9D8DDCCCCDF
+ CFCEE5D4D3DDCCCBE6D4D4E8D5D5DBC8C7E5D2D1EAD6D6E5D1D0DFCAC9E8D3D2
+ DDC7C7E8D3D3DEC8C7ECD4D3DCC5C3EDD5D4DDC6C5E9D1D0DEC6C5E1C9C8DFC5
+ C4E2C7C6DABFBEDCC1C0E1C5C3E7CAC8EFD2D1E5C9C8DCBEBDE3C6C3EED0CFE2
+ C2C1E6C6C5E3C3C1E5C3C1E7C4C2E0BDBBEDCCC9DCBAB8EBC9C7E6C4C1DCBBB8
+ EBC9C7EFCDCBEBC4C2DEB5B3E6BCB9E8BEBBE6BBB8E8BEBBE7BBB8EBBCB9E4B4
+ B1E7BBB9E5B6B3E8B6B2F0C3C0F3BEBAEEB5B1E4A6A2ECB3AFE5ADA9EFB7B3F5
+ B7B3F5B2AEEBA4A0E7A5A1F1B2ADEAA09CF0B3AEF3B1ACEFB1ADE8A29DEFB2AE
+ EEBCB6EEB0ACF0ABA6F3B1ACE7AFABE8ADA9F3B7B3E7AEAAE5A9A5F3BDB9EAB3
+ AFE8B1ADECB5B1E9B1AEF0BBB7E7B4B1F0C0BDE4B6B3534341AE8C8AFFD2CFE5
+ BDBB4C3E3DA48684D8B7B4352E2DB39A98B298978B7675A38A89EBC7C5ECC9C7
+ D3B6B4403736DDBDBBE1C0BEE8C8C7E9C9C8D9BAB8EBCDCB9581804E4444FCDD
+ DB8C7B7A635655F0D2D0ECCECC665958564B49A99594A491904F4645CCB6B6C7
+ B1B03C3635E3CCCBE0C9C8E0CBC9E1CCCADAC5C4EAD5D5DAC5C3D7C2C1E7D2D1
+ E8D2D16D6463817474E5CFCEE5D1D0DDC9C8E0CCCBE1CECDE5D3D3E6D5D4D9C8
+ C7E3D1D0DCC8C7E7D3D2D4C0BFEDD9D8DCC8C7E6D4D3E4D2D1F0DCDB776E6D00
+ 0000706665DFCAC8EAD8D7E3D2D1DFCECDDCCBCAE8D7D7DFCFCEE3D2D2E2D2D2
+ E3D2D2DFCDCDDECDCDE2D1D0DDCCCBDFCFCEDECDCCDFCDCCE2CFCFE3D1D1DAC6
+ C5EAD6D5EBD7D7E3CFCFDFC9C8EBD6D5DFC9C9E5D0CFDDC7C6F0DAD9DAC3C2E6
+ CECDDBC3C2E6CECDDBC4C3E7CECDEED4D3E2C7C6D9BEBDE2C6C5EDD2D0E2C6C4
+ EDD2D0EFD3D3DEC1BFDEC0BEE7C7C6DFBFBDE4C4C2E3C3C1DFBFBDE1C0BDE1BE
+ BCEAC6C4DBB7B5E8C5C2DFBCBAE0BDBBE2BFBDF0CDCAEDC8C6DEB6B3E7BCBAE7
+ BBB8E7BAB7E9BCB9E8BCB8EDBFBCE4B3B0E6B3B0EDC0BDE9B9B5E8B5B1F1C3BF
+ EBB2AFE5A8A4EEADA9E6ADA9EEB4B0F5B7B3EEA9A5E99F9AF0A7A2EAA8A3ECA0
+ 9BEEAAA5F1AEA8EBACA6EEA6A1EBADA8ECB8B3EEACA6F1A6A2EDAEA9EDB3AEED
+ AEA9F0B1ADE9ADA8E9AFABEEB5B2EBB0ACEAB0ACECB2AEE7AFABECB7B3E6B5B1
+ F4C3C0E6B5B2544342A98987EEC0BEFDCECA685554635655DFBFBD3C3231E3BE
+ BBF8D0CEE1BCBA4F4241C4A7A5EAC6C4E1BEBC655756CFB1AFDEBDBBDCBDBCE2
+ C3C2DBBCBAECCCCA534948786969FFE6E4897977635554F3D4D3EFD0CF645655
+ 837372F8DBD9EDD1D0D8C0BFE7CFCED5BEBD474040CFBCBAE2CBCAE0CBC9DEC9
+ C8DCC8C6ECD6D5E2CDCBE3CECDE3D0CEEBD4D36F6464817574E5CFCEEFDBDADE
+ C9C9DECAC9DCC8C7E8D4D3EAD7D7DAC7C6E4D1D0DEC9C8EAD6D5D5C1C0E7D3D2
+ D5C1C0E0CECCDFCCCBEEDADA746B6B0000006C6261E3CECDE6D5D4DBCAC9E0CF
+ CDDDCCCBE0D0CFDECECDE1D0CFE9D9D8DFCECEDAC9C9E3D1D2DECDCCE2D0D0E6
+ D5D5E0CECEE0CECEE0CDCDE2D0CFDECAC9EBD6D6E9D5D5E9D5D3E0C9CADDC7C6
+ E2CDCBE1CBCAE0C9C8ECD4D3DCC4C3E8CFCEE3CBCAE7D0CFEBD3D2E3CACAE9D0
+ CFE1C7C7EED3D2E6CBCADEC3C1DABEBDE7CBC9ECCFCEE1C5C4DFC2C0E4C6C4E9
+ C9C7E1C0BDE3C1BFE1C0BEE4C3C1E2C0BEE6C2C0E5C0BDE7C0BEE8C2C0E9C4C1
+ E5C1BEF3CECAEAC3C0DEB8B6E2BBB8E2B7B5E4B7B4EEBFBCE8B9B6E8B9B6EABB
+ B8EEBBB8EDB7B4EABBB7EBB8B5F1BCB8F1BFBBEAAEAAE9A7A3EDACA7F2B8B3F3
+ B6B2EEA9A4EBA09AF5A6A0EEA9A3EC9F9AEEA39EEEA8A2EDAAA4F4A7A2EEB0AB
+ EEB7B2EDA39EEDA09CECAFAAF1B3AEEFADA8EDAEA9EEAFAAF0B6B2EEB1ACECB0
+ ABEDAFAAEBAFABEDB5B1EFBBB7ECB9B6F5C1BEECBBB7584746AF8D8AF9CAC8E4
+ BFBC3A3231A98F8DDAB5B3392F2EE3BCB9F1C9C6E1BDBB322A2ABA9C9BE7C3C0
+ F4D0CEB59B9A937F7EECCAC8E8C8C6E8C9C7F2D1CFA6908F2C2626D8BDBCFFE0
+ DE877776695B5BF0D1CFFADBD96C5E5D7F7070F8DCDBE5CBCAF0D6D6C8B3B2E9
+ D1D09C8D8D7B6F6EEBD5D3E6D0CEDEC9C8E3CBCAB6A4A3E1CCCBEBD5D5EDD7D6
+ F4DEDD6A605F847877F1DBDAF4DFDEDFCBCAE7D2D2DECAC9E7D3D2E1CECDD8C4
+ C3EDD9D8E1CDCCDCC8C7DECAC9E0CDCCD6C2C1DECBCAEAD7D6EFDBD9736A6900
+ 00007A706FFDEAE9F3E2E1EDDCDBF0DEDDF4E2E1F4E2E1F2E1E0F2E1E0EFDEDD
+ F0DEDEE8D6D6ECDADAE8D6D6E4D2D2E8D6D6E7D5D5EAD8D7E6D3D3E9D6D5E9D4
+ D4EED8D9E9D5D4E8D2D2EBD6D5E9D3D3ECD5D4EBD3D3F1DBD9F1DAD8EFD7D6F0
+ D8D7F6DEDDF1DAD9F1D8D7EAD1D0E9D0CFEDD4D3EDD3D3ECD2D1E9CFCEECD0CF
+ EED0CFECCDCCEBCDCCEED0CFF1D4D2F2D4D2F0D1CFF4D2D1EDCAC8F4D0CEF1CE
+ CCF1CDCBF2CECBECC6C4F4CDCBF1C9C6EFC6C4F2C9C7F0C7C5EEC6C3F3CBC8EB
+ C3C1EDC3C0ECBEBBF3C3BFF2C1BDEFBDB9EFBEBAF3BFBBF2BAB6F4C1BDF3BDB9
+ F3BCB8F3BDB8F1B0ABF2AAA5F1AFABF1B3AEF7B3ADF6A8A3F5A29CF5AAA4F5A7
+ A1F6A6A0F7AFA9F5AFA8F4A59FF4B6B1F5B9B2F4A49EF1A6A0F1B3ADF3AFAAF1
+ ADA8F3B0AAF3B5B0F2B2AEF3B3AFF3B2ADF5B6B2F5BAB6F4BEBAF4BEBBF5C0BC
+ F8C6C2E6B9B6473838937977C4ABA9776665947B7AF7CBC9AB8C8B332A29B496
+ 95C1A2A16E5C5B8D7776F7D2D0F1CECCF2CFCEF5D3D0BDA3A2AB9492D9BCBBD3
+ B6B5907D7B584D4CC5ABAAF7D7D5EED0CE645757483F3FE1C5C4EBD0CE534949
+ 706363CBB5B4C3AFAEA59493817474EDD5D3F0D8D7A29190A89997D8C3C2D1BC
+ BB8E7F7E3D3737BBAAA97E7372C2B0B0CBB9B85C5353716766D1BFBFA89A987A
+ 706EF5E0E0EDD9D8ECD8D7E5D1D1E4D0CFE7D3D2EEDAD9ECD8D7F0DCDBEAD7D6
+ E6D3D2E4D1D0F1DEDDFCE8E6776D6D0000007B7271FFEEEDEAD7D6E4D3D2E4D2
+ D1EEDCDBE7D6D5EEDDDDF1E0DFEDDCDCF1DFDFEFDEDEF0DFDDEFDDDDEBD9D8EF
+ DDDCFBE8E8FDE9E9F8E4E4F7E3E3EEDAD9EFDADAEFD9D9EFD8D8FAE3E2F2DAD9
+ F0D8D7EED6D5F3DCDBEFD8D6F1D9D8ECD4D3F1D9D7F0D8D6F2DAD9EDD5D4EBD2
+ D2EBD3D2ECD3D3EFD6D5ECD2D1EDD2D1EBD0CFE2C5C4E8C9C7EBCBC9E9CBC9ED
+ CECCEDCECCF1D1CFE4C5C3EFCECCEFCBC9EFC9C7EFC8C6E7C1BEEFC8C6EEC5C3
+ ECC1BFEFC4C2D8B1AFE8BEBCF3C9C6EDC3C0F0C7C4EEC4C0F1C3C0F1BEBBECB7
+ B3EBB7B3F0BDBAF2BBB8F1B5B1F4BEBBF5BCB8F6BDB8F6BBB6F5ADA8F2A6A1F1
+ B0ABF5B3AEF6A8A3FBA39CFFA9A3FFB2ABFEA49EF9AFA8FCAFA7F5A29CFFC2BB
+ FFB8B2F9A09AF4ACA5F0AEA8F2ABA5F3ACA6F2AEA9F3B2ADF1ADA7F0ABA6F0AD
+ A8F1B2AFF1B8B4F4BAB6F7BDB9FBC4C1FFCBC7E8B8B5CCABA8D0B0AED7B3B0EE
+ C3C0FFD9D7FBCDCAECC0BEE5BBB9D0ADAAB99998D3B1AFF5CFCDEDCAC8E9C6C5
+ EBC9C7E5C3C2F9D6D4EAC9C8D0B3B2B19897BDA3A2EBCBCAF4D4D2F2D2D1E0C4
+ C3C5ADACC3ACABE1C7C6E6CDCBC9B3B2CEB7B7D0B9B7D1BAB9C9B4B3D8C0C0FB
+ E1DFF4DAD9FEE4E2EAD2D1CCB8B7AE9D9CB09F9DD9C4C3EAD3D2AE9D9DBEACAC
+ BEACACBAA8A7BCAAA9C3B1B0C1B0AFAC9D9BEAD7D6E9D6D5ECD7D6EFDAD9E6D1
+ D0EFDBD9F2DDDCF2DEDCF3DFDEECDAD8EAD7D6E3D1D0E8D6D5FAE5E4736A6900
+ 0000756B6BFFEDECF0DDDCEDDBDAE5D3D2F2E0DFE9D8D7E7D6D5ECDADAE4D2D1
+ EAD8D8EDDCDCEEDCDCF0DDDDE9D6D6E4D2D17F7575766D6C706767615A5A4842
+ 414D4646685F5F675E5D7F7372998A89CFBBBAF0D9D8EDD5D4EFD7D5EBD3D2EB
+ D2D2EED5D4EFD6D4EED5D4EED5D4E9D1D0EAD2D0EBD2D1ECD3D2EDD4D2F1D6D5
+ A89594827372F5D6D4EECECCEDCDCBEBCAC8E8C6C4F0CECCE7C4C2F2D0CEEFCC
+ C9ECC8C5E5BFBCE4BBB8EBC1BFEDC3C0EEC4C1EBC1BE5E4C4BDEB3B0F3C5C2EC
+ C0BCEEC3C0ECC0BDECC1BDEEC0BCF1BDB9EEB8B4F2BBB6F1BAB6EFB7B3EEB0AB
+ F3BAB6F5BAB5F7BDB8F9B8B3F4A59FF6A9A3FFBBB5F9ADA6D48882B5716C8E60
+ 5C784C49523A38442E2D68434081635FA06F6ACA7F7AEDA9A3FEB1ABF7AAA4F2
+ A7A2F4AFA9F4ABA5F3A9A4F2AAA5F1B0ABF1B6B1F3B7B2D5A19EA7817E866765
+ 7F63617C6765816E6D816A697D656478615F786260826968967A78B69492EAC3
+ C1F4CCCAF4CECBEDC9C7EFCCC9ECC8C6F0CDCBF6D2D0D1B3B1AE949389767573
+ 6261796867B89F9EDDC0BFB59E9DA08D8B8E7C7C837473786B6B837574887978
+ 7C6E6D786A69776A69776B6A6F6363665B5A6156566359586C61617B6E6E8D7E
+ 7EA09090BFACABE4CECDFFECEBF8E1E0F3DDDCF5DFDEF6E0DEF4DDDCF9E2E1F0
+ DAD9F2DDDCF2DDDCECD7D5EAD5D4E3CFCEE7D2D1ECD7D6F3DEDDF2DEDDF5E2E0
+ EDDAD8DFCCCAE2CFCEFEE9E87B7271000000766D6CFDECEBF3DFDEF0DCDBE9D6
+ D4EEDCDBECD9D8E7D4D3E4D2D1E1CECDDFCDCDE4D2D2E5D3D3E7D5D4EDDAD9CE
+ BDBC0000000000001210104C4545716666887B798F81818E81806D6362554D4C
+ 413A3A7B6F6FECD5D4F0D9D8EDD5D5F0D8D7EFD6D5EED6D4EBD2D1E9D0CEE9D0
+ CFEBD2D1ECD3D2EBD0D0EBD1CFFADEDD786A6A262121E8CBC9EED0CEEFCFCCED
+ CECBE9C8C6ECCAC8E6C3C0EDC8C5EFCAC7EBC6C3EAC4C2EBC6C3EEC6C4E4BAB7
+ F2C4C1BA9794070606C6A09EF7C7C3EDBDBAECBCB8EBBCB8E6B8B4E5B7B4F5C6
+ C2F0BCB9F3B9B5F0B5B1F2B7B3F0B5B1F1B0ACF5B9B4F5B8B2F7BAB5FAB0A9F4
+ 9E98AE78737C5855623E3C50302D5B3C39724643754A47724D49784E4B684F4B
+ 3E2927482E2C6649468D605CE29893FFB0A9F5A9A3F3A49EF2A39EF1ABA6F2B3
+ AEF2B2ADF1B5B0EBB2ADDBA6A3CFA9A6BFA09C3A2E2D4B3938755B590000000E
+ 0B0A9B7B79BC9694DAB3B1DCB5B3E9C2C0EAC3C1F2CCCAECC6C4EAC4C3EDC8C6
+ EEC9C8957F7D7967677A6766040303191616A69190E0C4C2E5C7C5DBC0BED4BA
+ B9C9B0AFB09B9A1B18188878786B5F5E0000000000000000001412123F38385C
+ 5251685D5C685D5D584F4F35302F2A2626373232383232342F2F776C6CDAC6C5
+ F6E0DFE8D2D1E7D2D1E8D3D1E9D4D3E4CFCFEDD8D7ECD7D5EBD6D5EBD6D5E1CD
+ CCE3CECDE1CDCCEAD6D4E5D1D0F4E0DFF1DDDCF1DEDCEDDAD9FBE7E6786F6E00
+ 0000706766E2CECCE9D6D5E4D0CFE2D0CEE1CECDDCC9C8EEDBDBD7C6C6DAC8C7
+ E1D0CFD6C4C4E2D0CFD8C6C5EBD7D7AE9F9E010101857877DEC9C9EBD5D5E7D1
+ CFF0D9D8F4DEDDE6D0CED4BFBD9485848C7D7D504847433C3CDBC5C3E3CBCBEB
+ D3D3DEC5C4E5CDCCE2CAC9E0C7C6E0C7C6E8CFCEE5CCCAE1C7C6E1C6C5EACECC
+ 635756000000B19A99F0CFCEDCBCBAE5C4C2DCBAB8E5C3C0DDBAB8E9C5C2E4BF
+ BCE0BAB7DDB5B3EAC2BFE4BCB9DBB4B2EFC4C1745F5D000000886B69FBC8C4E4
+ B5B1EEBCB8EBB6B3E6B2AEE7B4B1F3C2BEF3C3BEECB9B5E9B0ACEAABA6ECADA8
+ EBADA7F2ADA7F1B0ABFCB8B1C9928D714B487044414D383662403EB46762E98D
+ 86FA958CFFA39AFFB1A8FFA9A1F3B5ACD17E76895A555A3F3C5C3C38462E2C95
+ 6661FFA6A0F69F99EFA39EEEAAA4F1ACA7EFAFA9ECABA6EEB5B1EBC0BCECBEBA
+ FFCBC78264617D615FA9827F0000003D302FECBCB9E9BCB9F3C8C5EFC4C1E0B6
+ B4E1B9B6F0C9C6E2BBB9E8C2C0ECC5C3877170877372C0A5A41814141C1817D4
+ B7B6F2D1CFE1C2C1E8C9C7EDCFCDE1C4C2E3C5C4F9DBDA544A4A9784827A6A69
+ 0000003C3534B8A2A0DDC4C3E5CBC9EED4D2EED3D2F3D9D8E9D0CFDFC8C7B8A4
+ A3817474615756635959282424100F0F847777DCC6C5E0CBC9DFCBCAD7C3C2E6
+ D2D1EDD9D7DAC5C4DEC9C8E7D3D1DCC8C6E4CFCEDBC8C7DAC6C5DAC6C5E9D5D4
+ D4C0BFEAD7D5E7D4D3E5D0CE685E5D0000007A7170EBD7D5EEDCDBDECBCAE4D1
+ D0DAC7C6E1D0CEEDDCDCDFCECEE1CFCFEFDEDED9C9C8E9D8D7DBCACAF6E3E3AF
+ A0A0221F1FD8C4C3ECD7D6E6D2D0DCC6C5E8D2D1E7D0D0D8C2C1E3CDCBEAD2D1
+ 8C7E7CAE9C9B332E2E594F4FE4CBC9F0D7D6DDC5C4EBD3D2E1C9C8ECD3D2E4CB
+ CAE4CAC9E1C8C7E7CDCCE8CDCCCDB4B3847373453C3C5F5152FCDAD9DEBDBAF3
+ D0CEE4C2C0DCB9B6DDB9B7ECC8C6DAB6B3F0CAC8E1BBB7E3BBB8DEB5B3EDC3C0
+ C7A19F77615F614F4E4F403EF5C3C1E4B1ADE9B6B3E4AFACEFBAB6F4BCB8F5BC
+ B9F0BAB5E6B4B0EEBBB7E9B1ADEFADA8EFAAA5F1AEA8FDB1ABA5787464474585
+ 5E5A351D1C95605CFBADA5FF9890FD8B83FD938AFC9A90FCA39AFDA49AFEC4BB
+ FF9187FFB4ABC8827C62403C805450301E1D633F3CF3A19AF8ACA6F1A9A3EFA8
+ A4EFADA7EEBBB6E9BDB8F0B9B5E9ADA9F4B5B18764627F6260A27C7A00000050
+ 3F3EF6C7C3F2C4C1F1C5C2F5C9C6E5BAB7E6BCBAEDC6C3E3BDBAF1CBC9A88E8C
+ 826F6ECBADAB1C1818050505B69C9BF0CCCBE5C3C1DDBDBBE8C8C6E7C8C7DABD
+ BBDABEBCF9DAD96D605F907D7C7666650000007E706FF2D5D4EFD6D5DCC4C3F1
+ D9D8E2C9C9DAC2C1EDD6D5E5CECDE3CCCBF3DCDBC4B2B15D5453908281595050
+ 000000514949E0CCCBEAD5D5DAC6C5E8D4D3EBD7D6DECBCAD9C5C5DECAC9EAD6
+ D5D9C4C3E5D1D0E3CFCDE0CCCBE5D2D1DAC6C5F6E2E1EEDBDAEFDBDA655C5B00
+ 0000736A6AE9D6D5E5D4D3DCCACAE3D2D1D9C8C7E7D5D5E3D1D1DBCACADAC7C6
+ E3D2D2D7C6C6E2D1D0D9C8C7EBD9D9A29595696060E3CDCCE2CDCCE3CFCEDAC4
+ C3E3CDCDE5D0CFDBC4C4DDC6C5E2CBCACDB7B6786C6BA79393040403AA9695F3
+ D8D6DBC1C0E1C8C7DFC7C6E4CACAE0C7C6E4CACAE0C6C5E8CECDEACFCEA79392
+ A69292706262131111E2C3C1DDBBB8E9C6C3DEBAB8DEBBB8DFBAB8EBC7C4DBB6
+ B3E7C1BFE0BAB8E6C0BDDDB6B4F5CBC88A716FA887856D5756120E0EDDB0ADE4
+ B5B2ECBBB7E7B2AFEDB6B2E6ADA9F2B7B3F1B4B0E7ABA7EEB6B1EBB6B0EDB6B0
+ F3B2ADF9ACA6996B686747439B6C69151312A2716CFF9D95FFAAA0FC9E95FD80
+ 77FF9288FFA59BFFAAA0FFA298FFB8AEFE9389FEABA1FFA198E7968E5B39369D
+ 5E592B1B1A4D3432F8A9A2F4A9A3F0B2ACECBDB8EFB9B4EBABA6EBA9A4E8A9A4
+ F0B1ADA279768467659F7C79000000644F4EFAC6C3E1B0ACECBEBAF4C8C5E6BB
+ B9E6BFBCEDC8C5E8C3C1D7B7B5705E5DDEBCBA3A3231000000847270F6D3D1DF
+ BCBBE3C1BFDFBEBCE2C2C1DDBFBCE4C6C4E2C4C3F5D6D4766867927F7E766666
+ 000000978686E7CDCCE5CBCADBC3C2E5CECCDFC8C7DDC6C5E7D0D0E4CECCDCC7
+ C6E3CDCCF5DFDDD6C0BF695F5E968887675D5D0000004F4848E0CCCCDFCBCAEF
+ DADAEFDCDBD8C5C4DBC8C7D8C4C4E0CCCBDCC8C6D9C5C4D6C1C1DFCBCADDCAC8
+ D8C5C3F4E0DFF1DDDCEBD6D5655B5A0000006D6464E5D3D1E7D6D6E5D3D3E2D1
+ D0DCCAC9E5D3D3DCCBCAE1CFCEE2D0D0E1D0D0E2D1D0E6D5D4D9C8C7EFDDDD94
+ 89899B8E8EEAD5D4E3CDCDE5D0CFE4CECDE4CECCE5CFCEE4CDCDE1CBCAE2CBCA
+ EBD2D1736767B4A09F322C2C615655F5DAD8E2C8C6E2C8C7E7CDCBE2C8C7E4CA
+ C9E6CCCBE0C6C4E9CECDEED2D1887877C3ABAA3932320000009B8684EDCAC8E7
+ C5C2E4C2C0E6C3C0DFBAB9E9C4C2E5BFBDE5BEBCE7C1BEE6BFBCE7BFBCE1BBB8
+ 6E5A59CDA8A5151211000000B5908DF5C1BEF6C3C0ECB9B6E8B3B0EDB5B1F2B7
+ B2EFB0ACEEAEAAEDAAA6EEACA7F1B4AEFFC5BFAE807C5A3C3BB37B7609060695
+ 6560FFC2B9FEA79FFE8D83FFACA2FF8F84FF968BFFABA0FFB8ACFFBEB3FFB1A6
+ FFAFA4FFABA0FE9E94FF9E94E07E765E3A37C17F790C06066E4B49FEC2BCF6C2
+ BCEFACA7F1A9A4F1ABA7ECACA8F2B6B2FBC1BDAB8481866764A37C7A00000075
+ 5B59F9C3C0E8B9B6EABEBBEDC3C0E5BDBAEBC3C1E9C1BFE9C2BF7C6767CBAAA8
+ 7B67660000003F3434EDC9C7EFCDCBDDBBBAEAC9C7E6C6C4E7C8C6DEC0BFEBCD
+ CCE4C7C5F2D3D18D7C7A9D8A897A6C6B0000009C8C8BEED4D3E2CBC9EED6D6E7
+ CFCEE9D2D1ECD4D4E6CFCFE7D2D1E1CBCBE3CDCCE1CBCAE4CECDDFCAC9564E4D
+ B09F9F5951510000006D6363EBD7D6E8D4D4E9D5D4E3D0CFEBD8D7E2CECDE6D2
+ D1EBD7D6DAC6C6DFCBCAE6D1D1E4D0CFE3CFCEF4DFDEF1DDDCF2DDDC6D626200
+ 0000776E6EEBD9D8E4D3D3E7D6D5EEDDDDE8D6D5EBD9D8ECDBDBE8D6D6ECDAD9
+ EDDCDDE8D8D8E1D0D0D7C7C6F0DDDDBBADADDAC9C8EBD6D5EAD4D3F1DCDBEED8
+ D6E0CBCAE4CECCE5CFCEE4CECDE7D0D0F0D7D6776B6BAA98975249492F2A2AEE
+ D4D2F0D5D4E7CDCCE8CFCDEDD2D1EED3D2ECD0CFEACECDEED2D1E2C7C6867675
+ C1A9A80908080000004C4241F3D0CEE9C7C5E8C6C4EAC8C5E9C5C3EDC8C6E4BF
+ BCEBC5C3EBC4C1EAC2BFF8CDCAA58885A48683856C6A0000000000007E6665FC
+ C9C6F0BFBBF2BDBAEEB7B3F3BAB6F1B8B4EEB3AFEFB0ACF0ACA7F0A7A3F8ACA7
+ E19D984D3937C3908B231817452B28FDA79EFFABA2FEB9B0FF9F94FFAFA4FFBA
+ AEFFAC9FFFB5A8FFCABCFFEDE5FFC6BAFFCEC1FFB8ADFFA99FFF897FFF9F95A1
+ 66618A5954966D69000000B88884FFAFA9F5A8A2F3ADA8EEAEA9EBAFABE8ADA9
+ F3B6B1BB8D8A8E6D6BA8817F000000765E5CFFD0CDF0C2BFECBFBCECBFBCEABE
+ BCF3C8C6FBCFCDA98C8AA28785C3A2A0080707120F0FC6A8A6E7C3C1E1BFBDDF
+ BEBBF0CFCCF3D3D1F3D5D2ECCECDEFD2D1F2D5D3F8DBD9938281A18F8E7F7170
+ 0000009A8B89F1D7D6E8CFCEE9D1D0E9D1D0E8D0CFECD5D5F0D9D9F0D9D9EFD9
+ D8EFD9D8EDD8D7EBD6D6F3DEDDC3B3B2514A4AD4C2C21A1818070606BFAFAFF2
+ DEDDE6D4D2EBD7D7EAD7D7E8D5D4EAD6D5EDD8D8EED9D8F1DDDBEDD9D8EDD9D8
+ E3CFCEE7D3D1E7D4D2F6E0DF736968000000766D6DF4E2E0E2D1D0E8D6D6F2E0
+ DFEBDAD8E8D6D5EBDBDAE9D8D7EDDBDBECDCDCE8D8D8E4D3D4E2D1D1E9D9D9EE
+ DCDCF3E0E0E8D3D3EDD8D7F1DAD9EFD9D8E2CDCCE1CAC9E5CFCEE3CCCAE8D0CF
+ F1D8D76F6463C2ADAC443D3C211D1DE5CDCBEED4D2EED3D2ECD2D1F0D5D4EFD3
+ D2ECD0CEE9CCCBF4D7D6CAB2B29B88879985840000001613130B0A0AC5A8A7F2
+ CFCDE7C5C3EBC7C5EAC6C3ECC6C3E8C2C0E9C2BFEAC2C0EAC2BFE9C1BE725E5D
+ D1ABA8221C1B120E0E362B2B392D2DF2BFBCEFBCB8F0BDB8ECB7B4F0B8B4F1B7
+ B3F1B5B0F1B3AEF4B3AFF2AEA8FFB1AB7A514EA06965875C58000000C7918BFF
+ AEA5FE9E95FFB7AEFFD0C7FFB7A9FFDACDFFC9BBFFCEBEFFEDE4FFFDFBFFE3D8
+ FFE6D9FFCCBEFFA79BFFA197FFA197F9A79E635351D69D962013122A1A19F3A7
+ A1F9B3ADF5B2ACF3AFAAECA9A4E9A9A5EFB2AFCD9D9A937370A5817F00000074
+ 5A58FFC7C4EBB9B6EBBBB8EDBFBDE9BDBBF4C9C7D0ACAA786463E5C1BE2F2727
+ 0000008E7977FED9D6E4C3C1E7C6C4EFCECBE8C7C5F0D0CEEFCFCDE8CCCAEBCF
+ CEEDD1D0FADEDC8F7E7EA492918274730000009A8B8AF4DAD8EDD4D2E7CECEE7
+ CFCDE1C9C7E2CBCAE9D2D1ECD5D5EAD3D3EDD7D6EDD7D6E9D4D3E9D4D3F8E1E0
+ 7268679D8F8F8F8382000000524B4AF3DFDEE6D3D2EDD9D9EDDBDAEAD8D8E9D7
+ D6EBD6D5EDD8D7EBD6D5E9D5D4E8D5D3DECBCADFCCCBEEDAD9F3DFDE73696800
+ 0000766D6DFAE8E7F8E7E6F4E3E2F3E1E1DDCCCBE5D3D2EEDCDBE4D4D3EAD9D9
+ EEDEDEEBDBDCEBDBDBE8D7D8DECDCDE0CECEF1DDDDECD8D7EDD9D8EFDAD8E3CD
+ CCE7D0CFEBD5D4EAD4D3EAD2D1F4DBDAB8A5A46E6261D5BEBC0E0C0C393333EA
+ D2D0F0D6D4EDD3D1E8CDCBE4C9C8ECD1D0EED3D2E8CCCBF5D7D59F8B8AB8A09E
+ 594E4D0000009C8685262121625453F6D2D1E8C6C4E9C5C4EAC7C4EAC5C4ECC5
+ C3EBC2C0EBC3C1F1C6C3AF908E997C7A9F817F000000705A59B99492070606D3
+ A7A4F7C1BEF1BBB6F1BAB6F3BAB6F4B9B5F3B7B3EFB2ADF2B2ADF5B1ABDC9D98
+ 5C403EDE968F120B0A392220FDAAA1FFBAB2FFB9AFFFB9ADFFDBD1FFEDE6FFE4
+ DAFFF6EAFFF0E2FFFFFFFFFCFCFFF7F3FFF8F0FFD6C7FFC0B2FFC7BBFFC1B9FF
+ CDC395635DB16E68905F5A000000A6736FFFB4ADF5ADA7F4B2ADF4B6B1F3B8B3
+ F1B5B1C99693926E6BA47B78000000755A59FEC8C4ECBBB8E9BBB8ECC0BEEBC0
+ BEEDC4C2756261CDAEAC6F5E5E000000514545F0CDCAECCAC8ECCCCAF5D4D2F6
+ D4D2ECCBC9EBCBC9F2D3D1ECCFCEECD0CEEED2D1F8DCDAA08F8EA694947F7171
+ 0000009B8A89FBDFDEF2D8D7F0D7D5ECD3D2EBD2D1E7CFCEEAD2D1EBD4D3E8D1
+ D0ECD5D4EED9D8E8D3D3E9D4D3F1D9D9C7B5B4534C4CD5C3C20F0E0E040404CD
+ BBBBE8D5D4E6D3D3E9D7D6E7D5D4E9D7D6EEDADAF0DCDBEFDBDAECD8D7EEDAD9
+ EDDAD8EEDAD9F2DEDDFEEEED7C7271000000716968EDDBDAE4D3D2E8D7D5F4E2
+ E1D9C8C7E0CDCCECD9D8E0CECEE6D5D4EBDADAE4D5D4E7D6D6EBDADAE6D4D4D9
+ C7C7E2CFCEEAD5D4E9D4D3ECD7D6D6C0BFDDC6C5EAD4D2E3CCCBEED6D4C1AEAD
+ 4F4747D5BEBC8678770000006C5F5FF1D6D4E6CCCBE2C7C6E0C4C3D8BDBBE8CC
+ CBE5C9C8E6CAC8F4D7D5857473C7ACAA161313161313EBCBC8867472120F0FDA
+ BBB9ECCAC8E5C2C0E7C5C2E6C2C0E9C3C1E7BFBDEBC3C1F0C6C376615FC69F9D
+ 312827080606D2A7A5EFBDBA161111967472FBC1BEECB4B1EDB4B0F2B7B3F3B6
+ B3F2B3AFEDADA8F5B2ADFEB7B2996E6A9D6E6AA87570000000895752FFA59CFF
+ 968DFFB8ADFFE1D5FFEADDFFFBF4FFFDFBFFFFFDFFFEFDFFFFFFFFFFFFFFFFFF
+ FFFEF5FFF2E7FFE5DAFFE7DDFFCBC2FFA59ACE7D767C534ED28B850000004D34
+ 32F8AFA9F5AEA9F2ACA7EFA9A4EFABA6F1AFABC7918D926F6CA47E7A00000075
+ 5D5BFAC8C5EABEBAE9BFBCEFC6C3FCD2CF947C7BAB908EAE9391000000151212
+ D4B6B4F5D1CFE8C5C4EBC8C6EAC7C4ECC9C7F1CECCEFCDCBEACAC8E8C9C8EDCF
+ CEECCECDF3D4D2B9A4A2A995957C6D6D000000958483F2D6D5E9CFCEE8CECDEC
+ D3D2E8CECDE8D0CFE9D0D0E6CFCEE7D1D1E6D1CFE9D4D4ECD7D7EAD5D4E6D1D0
+ EBD5D5544D4DCAB9B8514A49000000877C7BF5E1E0E2CFCFE5D4D3E9D7D6DDC9
+ C9DFCCCBE6D3D3E8D6D5E3CFCEEAD7D6E6D3D2ECD8D7ECD8D7F2DDDB71676700
+ 0000797070E9D7D6DBCAC9D8C7C6EEDCDBE0CECDDDCBCAE5D4D3D5C5C4DECCCB
+ DDCCCCE3D2D2D9C7C7E9D8D7DECDCCDBC8C9E6D4D3E7D3D2E3CECDE9D4D4D7C0
+ C0E0CAC9E6CFCDE2CAC9958584484040C3AEADAF9B9A0A0909080707B7A1A0F2
+ D8D6DEC3C2DEC3C1ECD1CFDBC0BFF0D5D3DDC1C0DFC2C1CEB3B28674739F8887
+ 000000594C4CFAD8D6D8BBBA0C0A0A937E7DEFCDCBDFBDBBE1BEBCDEBAB8E2BD
+ BBDDB6B3EFC6C3C2A09E866C6BA1817F0000005C4948FBC9C5F0BBB84F3D3C56
+ 4240EEB4B0E4AAA6E3A7A3E7A8A4EFAEAAEAA8A3EBA7A2EFA9A4F6ACA6674745
+ CE8D885B3E3B000000B37973FFAEA4FFA99EFFB2A7FFCABDFFF1E7FFFEFBFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F3FFDDCFFFC6B9FF
+ B0A5EE9A9168423FE7968F170F0E120C0BE69994F5A8A2ECA7A1ECADA7EBB1AC
+ F2BAB6C99A97917270A27F7D000000735B59FAC7C4E8B9B7E8BBB8FECFCCB091
+ 8F796363BD9C9A161212000000987E7DF2CBC9E5C0BEDFBAB9E1BCBADCB7B5DB
+ B7B5E7C3C1E5C3C1DFBFBDDEBEBCE2C3C2F0D1D0F5D6D4B29C9BA38F8D776968
+ 0000008D7C7CECD1CFE5CCCBD9C1BFE4CBCBDDC5C3DCC4C3DCC5C4E2CCCBE8D2
+ D2DAC5C5DFCACAEDD8D8E7D3D2D5C1C0F4DEDD7B72719C8F8D8A7E7E00000057
+ 5150ECD9D8DAC8C8E2D1D0E9D5D6D6C2C2E2D0CFEDDADADFCDCCD0BCBBDECAC9
+ D9C5C5E0CDCBD8C5C5EEDBD9695F5E000000786F6FE6D3D3E8D6D5DECCCBE0CF
+ CEDDCCCBE2D0CFEBD9D9D8C7C7D8C6C5DECECDEDDCDBDBCACADECDCDDCC9C9E9
+ D6D7E8D6D6EAD6D5E5D1D0DCC6C6D7C1C0E5CECCDFC9C8695E5E685C5DE3CCCB
+ 9A89870F0E0E000000726464E3C9C7E6CCCAE3C9C6DFC4C3EBD0CFDABFBEE2C6
+ C5E0C3C2F7D9D7A8908FA58F8E6F605F000000947E7DF7D6D4EFCECD5C4F4E37
+ 2F2FE5C4C1E7C4C3E5C2C0E4C0BEE3BFBDE2BCB9F7CECB846D6CB69492413534
+ 000000BA9694F4C4C1F0BDBA9B7A781D1615DDA9A6F0B7B3ECB2AEE5A8A4E7A8
+ A3ECAAA6F3AFAAEFA7A2E39C9760403EE596902A1B1A020101D5817AFF9E94FF
+ ADA2FFC8BBFFDBCEFFF2EDFFFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFDFAFFEBDFFFCEC0FFB5AAF99D93704742E4968E3E2A280000
+ 00C58E8AFEB9B2EFAEA8F1B2ADEAABA7F2B4B0CA9692916D6BA47B790000006B
+ 5352F4BFBCE3B4B0E1B3B09E7F7D62504FA183811F1918000000836E6EEEC7C5
+ EFCBC9E6C2C0E6C3C1E3C0BFE6C4C3E2C1BEE4C3C0E5C4C2E8C9C7E8CAC8DDC0
+ BEF0D2D1EED1CFA69190AB98977D6F6E0000008F7F7FF1D7D5F0D8D7E2CBC9E0
+ C9C8DEC7C6E3CCCBDDC8C7E6D0D0E7D2D1D9C4C3E3CECDEAD5D5E3CFCED7C3C3
+ F4DFDF887D7C847878A79899000000343130E7D5D4E0CDCDE9D7D7E7D4D3D7C4
+ C4E6D5D4EAD8D8E8D6D5D2BEBDD4C0C0E4D1D0E2CFCDD8C5C4FCE9E76B606000
+ 0000746B6BE6D3D3EBD9D9DCCACAE0CECDDAC8C8E3D2D2E3D2D2D8C7C7E4D2D1
+ DAC9C9DDCCCCD9C8C7E6D5D4DBC9C9DBC9C9D9C6C6E4D0D0DFCACAD6C1C1ECD5
+ D4A896954D4544948482D7BEBD6B605F000000000000605555E0C6C4E4CAC8DB
+ C1C0DDC3C1DCC1C0E3C7C6E0C4C2E0C4C3E0C3C1F6D7D5837170C0A6A5312A2A
+ 090707C9ACAAEBCAC9E4C3C2C0A5A4090808B69B99E7C3C1DEBBB8E4C0BEE3BE
+ BCE6BEBCCEABA97E6766B79592000000463837EFC0BDE3B4B1EEBDBAD8ABA816
+ 1110AF8582F3BBB6EBB3AEE7ACA8E8ABA6EBACA8F0B0ABEFABA5D59691684845
+ E49A940C08080B0707EC958EFFA096FFA89DFFB5A8FFD9CAFFFFFAFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF7FFEEE0FFCABBFF
+ B6AAFFABA16C4843E197905B3D3A0000009D6D69FEB1ABEFABA5F1B0ABEAACA8
+ F1B5B1CA989491706EA27E7B0000000C0A09342A29372D2C231C1C000000251F
+ 1E010101100D0E9B8281F8D1CFE2BEBCE5C3C0E2C0BEE2C0BEE8C6C4E0BFBDE0
+ BFBDE4C4C2DCBCBAE5C7C5E1C4C2DEC1BFF1D4D2F2D5D3A48F8FAC9898796B6B
+ 0000008E7E7DE4C9C8DFC6C5E1C8C8D9C2C1E2CBCAE9D2D2DCC6C6DEC8C8E1CB
+ CAD8C2C1E2CCCBEFD9D8E6D0D1D8C4C4EBD7D6918585736969BAAAAA0000002A
+ 2727E0CDCDDAC6C6D7C3C3DAC6C5D6C3C2E7D4D4EBD9D8E2D1D0D5C1C0D9C6C4
+ D4C1BFE7D4D3D6C3C2E7D2D1685F5E000000706767ECD8D9ECDCDAEBDAD9EEDD
+ DCE6D5D5E5D5D5E8D8D8E4D3D3ECDBDAE6D5D5DFCECEE4D3D2ECDBDAE4D1D1E3
+ D1D1E5D2D2E5D1D1EBD6D5E3CECD8679795C5352D2BDBDB7A4A2282323000000
+ 080707877878F0D6D4F3D9D8E9CFCEE4CAC8E8CDCCEBD0CEE8CDCBEACECCE4C8
+ C6DEC1C0DFC2C07C6B6ABDA3A2030202423938ECCBC9F0CFCEEACAC8F5D2D13E
+ 35355E504FF4CFCDE9C4C2EAC6C4E5C0BDF6CCCA907876C19F9D5D4D4C000000
+ AC8B89FCCBC9ECBDB9EFBDBAF5C0BD403231765958FCC0BCEFB2AEF0B1ACEBAA
+ A5ECA8A4F3ACA7F0A49FD5918C684441E8948E0B07070B0706ED8981FF9086FF
+ 9A8FFFB0A4FFCCBCFFF5E9FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFF2EDFFDFD4FFC2B86A4C48E5A39C5C423F0000
+ 009C726EFFC0B9F5B6B1F1B4B0F0B5B1F5BCB8CF9F9C927270A5817E00000050
+ 3F3EBC9694B18E8CB2918F9379774E4040211B1B3F3434615150B99C9BF1CBC9
+ EBC7C5E8C5C3E8C5C3F1CECCEFCECBEECECBF0D0CEEACBC9EECFCDECCECCEED1
+ CFEFD1D0F6DAD8A99494AE9B9A7D6F6F000000948584F2D7D7EDD4D2E2CAC9D6
+ BFBEE4CDCCECD5D4E2CBCAE9D2D1EBD5D4E6D0D0E8D2D2E8D2D2E8D2D3E6D3D2
+ EEDADAAA9D9D7F7473C5B5B40000002C2829E9D5D4EFDBDAE8D4D4E7D4D4E4D1
+ D0E8D5D4EAD8D7EBD9D8E8D5D4E7D4D3DECBCAEAD7D6E2D1D0F0DEDC756C6B00
+ 0000776D6CFBE7E6E8D7D6F0E0DFF1E1E0EDDDDDE9D8D8EEDDDDECDBDBEAD8D7
+ ECDBDBE8D7D6EAD9D9EAD8D9E8D6D6E9D7D7E4D1D0E7D2D1DBC7C75F56568E80
+ 7FDEC7C67C706F000000000000332D2DB4A09FFADFDDEED5D3EED4D2F0D6D4EB
+ D1D0ECD2D0EED3D2EDD1CFEBD0CEEDD1CFDEC0BFB79E9D958281968381000000
+ 82706FF2CFCCECCAC8E7C6C4F8D5D39983810F0D0CD9B8B6EFCAC8E9C4C1EDC4
+ C2DFB8B6836C6ACCA8A5040303372C2BF0C2BFF0C0BDF0BDBBEEBAB7FDC4C080
+ 6360382A2AF3B7B3F1B2AEECABA7EDAAA6E9A4A0EAA39FF4A8A3DE99956B4845
+ E699940F0A090B0706ED9088FF998FFFA99FFFB5A8FFCBBCFFF5E6FFFFFCFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFF3ECFFF5EFFF
+ E5DAFFD3C869524EE5B0A95B4643000000A57E79FFC5BFF5BDB7F2BBB5F1BBB6
+ F7C1BDD1A4A1927471A684820000007A6362FFD2CFF1C4C1F1C6C3F8CDCBF8CE
+ CCC3A3A2705E5D605050040303857170F5D0CEEFCCCAEFCCC9EDCBC8EECCCAEC
+ CAC8EECDCBF2D1D0EECECCF2D4D3F3D4D3E9CBCBF2D6D5AE9A9AA59291786A6A
+ 000000968685FADFDFF4DAD9E1C8C7DAC2C1EED6D5EFD8D6EAD3D2EBD4D4E8D2
+ D2E9D3D3E7D2D2E9D4D4E8D4D4ECD8D8F6E1E1998C8C857A79C3B3B20000002D
+ 2A2AE9D6D5F1DCDCEBD8D6E9D5D5E8D4D4E4D1D0E8D5D4EAD8D7EFDBDAECD8D7
+ ECD9D8EFDDDCF1DFDEFFF0F07D7474000000786E6DFEEAE9EBD8D7E9D8D7F0DF
+ DFEBDBDAE6D5D5EFDEDDEDDCDBECDADAE9D8D8E7D5D6E6D5D5E9D7D7E3D2D1E3
+ D1D1EAD6D5DAC6C55B5353A29292C8B4B235302F000000070606746968DDC6C5
+ EBD1CFEDD3D2EBD1CFEAD0CEEBD1D0E4C9C7DFC4C3E9CDCCE6CAC8E3C6C4EED0
+ CFF7D8D69B8786B9A19F584C4B000000CAAEADF5D1CFEFCDCBEBC8C6EECBC9DF
+ BDBB1A17168B7573FBD3D1EEC6C3FED3D1A58987B394916E59580000009D7F7E
+ FBCCCAEBBDBAEBBCB9EDBDBBF6C2BFC69C99181312D9A9A6F5BEBBEEB6B2F2B8
+ B4F2B7B2F0B2AEF7B6B1ECAAA5624542E69A9432201E020201D78079FF968CFF
+ 9B91FFB9AEFFD3C6FFEDE2FFFEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFAFFEFE8FFECE1FFDBCDFFB2A6F6A39A664441E7A69F3D2D2B0000
+ 00CA9B96FDC4BFF3BDB8F2BCB8F0BDB9F6C3BED0A6A2927573A5848200000075
+ 605EFDCECAE9BFBCEAC1BFEAC3C0ECC6C4FBD3D1B69A988571706A5A5A000000
+ 917C7AF5D1CFEFCECCF0D0CEF2D2D0F1D1CFF0D0CFE9CAC8EACCC9EDD0CDEDCF
+ CEE8CCCBEFD3D2B39F9EAA97977C6F6E000000988787FCE1E0F1D8D6E6CDCCEA
+ D1D0EED6D6EED6D5EED7D6E8D1D0E4CDCDE4CECEE8D2D2E9D5D5EBD8D7EBD7D7
+ F4DFDF897E7D9D8F8FA09292000000403B3BEEDAD9EAD6D6F0DCDCECD9D8E8D5
+ D4E8D6D5E8D6D5E6D3D2E6D3D2E6D4D3E0CECDE5D3D2E8D6D6FDEAEA7E747500
+ 0000796F6EFFEFEEF3E1E0EFDDDDF1DFDFECDCDCE4D3D3EFDDDDF2E0DFEFDDDD
+ EBDBDAEDDCDBEEDCDCEDDBDBE9D7D7E4D1D0EED9D8706565A79897B4A2A11110
+ 0F000000342F2EB7A4A3F8DEDDF1D8D6E8D0CEF1D6D5E2C8C7E5CBC9F3D8D7F1
+ D6D5E9CECCE9CDCCEDD1CFEDD0CFEED1CFF1D2D0867474CCB2B11411112A2424
+ F3D2D0E3C1BFE1BFBDE3C1BFF4D1CFF7D1CF6D5D5C2F2727F5CFCDF5CECBE5BF
+ BD7C6867D0B0AC0F0C0C241E1EEBC3C0EEC5C3E9BFBDEBC0BEEDC1BEF1C3C0E7
+ B9B62A20209F7D7AFCC3C0EEB4B0F1B3AFF4B2AEF2ACA8F2A9A3FBADA76C4946
+ D78E885F3E3C000000B4746EFFABA2FF9E94FFA99DFFCEC3FFF7F0FFFFFDFFFE
+ FBFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFCF5FFF3E9FFCBBEFFBFB6FF
+ C9BEEEA39A6B4642E9968F160E0D18100FE8A39EFAB8B2F7BBB5F5BCB8F3BEB9
+ F5C2BED1A7A4927674A6878400000076605FFED0CCECC2BFEDC4C1EFC7C4E9C2
+ C0E4BEBBF1CBC96E5C5CB69A99151212110E0FD8B8B5F0CECBEBCAC8F1D1CFF3
+ D4D2F1D2D1EBCCCAE8CBC8E2C5C3DFC3C1E3C8C6E7CCCAAC9897AC9A997F7171
+ 0000009A8988FDE3E2F0D9D7EAD2D1ECD5D3EED8D7EDD7D6EFD9D8ECD6D6E7D2
+ D1E7D2D2E8D4D3E8D5D5EAD6D6EDDADAF7E3E2716868C9B9B87A70700000006D
+ 6564FAE7E6E5D1D1F1DDDCEFDBDBE9D6D6E9D6D5EBD8D7ECD8D7EAD7D6EFDDDC
+ EBD8D8EDDBDAEFDDDDFBE9E87A7170000000726868F2DFDFDFCECDE7D6D5E3D2
+ D2DECDCDE3D2D2E8D7D6E6D4D3E0CFCEE5D4D4EBDADAEBDAD9E0CECEDCCAC9E8
+ D3D3AE9E9D7B6F6FC2AFAE0B0909000000625857DBC4C3EED5D4EED6D5DFC7C5
+ D8C0BEEBD1D0E0C6C5D7BDBCE8CDCCE4CAC9E7CDCBE8CCCBE1C6C3E1C4C2E7CA
+ C8D8BEBC867473B49C9B000000615352F7D5D3EECDCBEAC9C7D7B6B4EAC9C6F5
+ D2D0C2A6A4040403BCA09EFFDEDB9D8482A68D8C84706E000000887170F5CAC9
+ EAC0BFEDC2BFE9BCBAE8B9B6EDBCB9F8C1BE574241574241F7BBB7ECB0ACF0B0
+ ACECAAA6ECA8A3EDA7A1FFB6B19D6E6B9E6D6AA4716C000000885551FF9D94FD
+ 9D93FFC3B9FFE2D8FFE9E2FFDDCFFFF4E8FFFFFFFFFFFDFFFFFFFFFFFFFFFFFC
+ FFFFFFFFF1E8FFE0D1FFCDC0FFAFA5FF988ECC87807C5D59D09690000000573C
+ 3AF9ACA6F6AEA8F6B0ACF6B4AFF0B3AFF0B7B3D0A29F927572A5848200000072
+ 5D5BFDD0CDE9BEBCE6BEBBECC5C2EEC7C4DDB8B5EFC9C6877170A088865F5150
+ 0000009D8584F1CFCDEDCDCAE4C4C3EACAC8F0D2CFE3C4C3ECCDCCE5C8C6E1C4
+ C3EBCECDEFD2D0A69090AA96967D706F000000948484F0D6D5ECD5D5EDD6D5E4
+ CDCCE7D0CFEAD4D3E1CCCBEAD5D5E7D3D1E4CFCFE1CECEE8D4D4E7D4D3E6D3D4
+ DBC7C75D5454E0CECE373232000000988B8BE9D5D4DBC9C8E8D5D5DFCCCBE1CE
+ CDE8D5D4E7D4D3EEDBDBE1CFCEDFCECDEAD8D8EBD9D8E1D0D0F2E0DF766D6C00
+ 0000797070EFDDDCDCCBCADECDCCDDCCCBE3D1D0DCCBCBDFCECEDDCBCBE3D1D1
+ D9C8C7EAD9D9EDDCDBDDCBCADCC7C6F0DADA726766C5B3B24A43430000007D72
+ 70E5CDCBEAD2D1E9D1D0DEC6C5DFC7C5DFC6C5E2C9C7E5CBC9DAC1BFE5CBCAD7
+ BDBBE4CAC8DAC0BEDEC2C0D2B5B3EBCECDB19C9BA28D8C7D6D6C0000009C8886
+ E5C5C3DBBBBADDBEBCE5C6C4F4D4D2F5D4D2F4D1CF372F2E554847EBC5C36353
+ 51CAAAA71D1817120F0FD6B0AEE9BEBCECC1BFE8BBB8E5B6B3EABAB8E5B3B0F7
+ C1BE9D7977261D1CE0A9A5F0B4B1EBAEABEEB1ACEBACA7EBACA7FBB7B2DD9E99
+ 5E423FDC928D100808382321FDB5ADFEBDB4FFB7ADFFC7BEFFB3A8FFC0B2FFF0
+ E4FFFCF8FFF0E6FFF9EFFFFDF9FFF6EDFFF3E7FFE8DEFFC1B3FFB1A6FFA69CFF
+ B1A7965752AF69648D5F5A000000B08480FBB6B0F5B3AEF7B7B2F2B3AEECAFAA
+ F2B5B1CB98958F6E6CA37E7C000000725C5AFFD0CDE5BAB7ECC2BFE4BCB9F3CB
+ C9E2BCBAF4CDCB8D76759E868483706F0000006B5A59F3D0CEE4C4C3E1C2C0E1
+ C2C0E9CAC9E2C4C3E5C7C5E5C9C7E1C5C4E1C4C3E1C4C3B09A99B09C9A807271
+ 0000008E7E7EEDD3D3DCC5C4E8D0D0D9C2C0E4CDCDE2CBCBDEC8C7EAD5D5E0CC
+ CBD9C4C4E2CECEE4D1D1DCC8C8E9D5D4A597977F7474C3B3B2020202120F0FD2
+ C0C0E9D5D5D9C6C5EBD8D7D4C1C0D9C5C4EDDAD9E6D3D2DFCDCDD7C6C5E5D4D3
+ DFCDCDE1CFCEDECDCCEDDAD9675E5E0000007A7271F0DFDEE4D3D3E4D2D2E1D0
+ CFEAD9D8DBC9C8DECCCCE5D3D3F0DFDFD8C7C6EBD8D9F6E3E2E2CECDE1CCCCE8
+ D3D2766A6ABCAAAA030203413A3AE8D2D0DFC8C7DEC7C5EAD3D2DBC4C2E4CCCB
+ E7CECDDEC6C5E2C9C9E0C6C5EBD1CFDBC2C0ECD2D1DBC1BFEACFCED6BBB9EED2
+ D0857674C1A9A83F3837040404D3B8B6DDBEBCD8B9B7EFD0CDE7C6C4E9C8C6F5
+ D4D1FBD6D4917977100D0D715E5D927A78987F7E000000766261F4C9C6E4BAB7
+ ECC0BEE8BBB8E7B9B6F1C1BFE5B5B2EFBCBAD6A6A31D1716B88D8AF5BCB8EAB2
+ AEF0B7B3EDB0ACECADA8F4AFAAFEB0AA784F4CA16C68805B58000000C8918AFF
+ B9AFFCAFA5FF948AFF968BFFBFB4FFE2D5FFD3C6FFC0B1FFD2C5FFE5DCFFDACB
+ FFCABCFFD6CAFFC3B8FFA298FF9D93F99C93614441DB928B2A1816392322F7AE
+ A8F0B7B1F3BCB6F6BBB6ECB0ACEDB3AFF8BEBACB9B978E6D6BA27D7B00000073
+ 5A59FECAC7E5B8B6F0C5C2E4BBB8EEC7C4E4BEBCF9D2D08D7676B09493806D6B
+ 000000716160F4D2D0E2C3C2E1C3C1E2C4C2E4C7C5E2C5C3E2C4C3E4C8C6E1C6
+ C4E0C5C3F0D3D2B4A09FAC9897807271000000938483F8E0DFDDC6C5EAD2D2DC
+ C5C4EAD4D4DFCAC9E3CECDF0DBDBE5D1D0DCC9C8E1CDCCE9D5D4DFCBCBE8D4D4
+ 655D5DCEBDBC5852520000006E6464ECD9D9EBD7D7DECAC9E7D3D2DAC6C6DAC7
+ C6E7D5D4E9D7D6DAC9C8D9C7C6EFDDDCDAC8C8DCCBCAE6D4D3F2DFDE665D5C00
+ 0000706867E9D8D7DECDCCEAD9D9E0CFCEDDCCCBE6D5D3DAC9C7E2D0D0E8D7D6
+ D8C7C6EFDCDBF2DEDDDFCBCADAC5C4E3CECD7B6F6F9A8C8B000101948685E9D3
+ D1DDC7C6D8C2C1E3CDCCDBC6C4EAD3D3E5CFCEDEC7C7E2CBC9CDB8B7E0C9C7D9
+ C0BEF0D6D4DEC3C1DEC3C1DCC0BEDFC4C2726362BAA1A00504042F2828DCBFBC
+ E6C7C5E1C1BFE3C2C0DCBBB9E8C6C4F6D4D1EFCBC8D7B3B1221D1C171414CEAC
+ AA2D2625080707CEAAA8EFC5C2E2B9B7E5BBB9E5BAB7E8BBB8EDBFBCE4B5B2E8
+ B8B5ECBAB73F3231775C5AFDC5C0EEB6B2EDB2AEECAEAAEDAAA6F3A9A5F8ADA8
+ DFA29D54423FC8938E20161546312FFDB2AAFC968DFD8B82FF9D93FFBAB0FFBD
+ B2FFBBAEFFB3A6FFB2A7FFEDE5FFD1C5FFB4A8FFAFA5FFBFB5FEA299FFA299A7
+ 6C66855350A16D68000101BD817CFBA39DF0A19CF4B3AEF4BEB9EBB8B3EBB5B1
+ F6BDBAC7989591716FA37F7C000000765F5DFDCBC8E8BAB7EFC1BFE5BAB7EAC0
+ BEE4BCBAF9D1CF715F5EC9A9A84D42410000009F8886F0CFCEEACBCBE1C3C2DF
+ C2C0E6CAC9E1C5C4E0C3C1DFC2C1E1C5C4E3C8C6E9CDCB897978A08E8D827373
+ 0000008A7B7AEED6D5E4CDCDE6D0D0DCC7C7E4CECEDDC9C7E3CFCFEFDADAEBD8
+ D8E0CDCEE1CDCDE1CDCDEFD9D9938685857979A395950000001D1B1AD1BFBFE0
+ CECED8C4C4DECACADAC6C6DCC9C8DBC9C7E2D0CFEBD9D8E9D7D7DBC8C7DECCCB
+ D9C8C7E2D0CFDECCCAEDD9D96F6666000000766E6DFBE9E8EFDEDEEEDDDCEAD9
+ D8E8D7D6F0DFDEEBD9D8EEDDDDEEDCDCE7D5D5E9D6D6EBD7D6EFDBDAE8D3D2EE
+ D9D8887D7C9B8F8E0B0B0AAD9D9CF1DAD8E7D0CFDFC8C8E5D0CFE3CECDEBD6D4
+ E9D4D3E9D3D2F7DEDE918483D2BCBBEED4D3F1D8D6E8CDCBE3C7C5E9CDCBB59F
+ 9E8B7A799D89880000005D5150F8D7D6F1D1D0EACAC8E4C4C3E8C8C5EECCCAF1
+ CECCF1CECBF8D1CF715F5F3F3535A88E8C00000060504FF8CFCDF1CAC7EAC2BF
+ EAC0BEEBBFBEEDC1BFEEC1BFEDC0BEEFC1BEFFCECB695452312524F6BFBBEFB6
+ B2F0B3AFF2B0ACF1ADA9F0B3AFF2BBB5FEC3BDBB8B86604341B0807B04040498
+ 5D58FF9D94FC9C93FDA79EFFB1A6FFA79CFF948AFF9E93FFA69BFFD6CCFFABA0
+ FF9F95FE9C92FDAAA0FFB8AFE6968E4F302EC1837D0F0707775350FFBAB3F4B0
+ AAF4ACA6F5AAA5F4ACA8EBAEAAECBAB6FAC9C5AD88858B6E6CA9868300000075
+ 5E5DFFD3D1F3C8C5F0C7C4EFC6C4F0C7C5FACFCDD0ADAB6F5D5CDCB9B70C0A0A
+ 1E1A19E4C3C2EBCBC9EBCDCCEBCDCDE7CAC9EED1D0ECD0CFEBCFCEEBCECEECCF
+ CDE8CCCBECD1CF8C7C7BA1908F807372000000786D6CFDE5E5F0D9D8EED7D6EF
+ D9D9EFDAD9E8D4D3E5D0CFEBD8D8E6D3D3E9D6D6EFDBDBFBE6E6B0A1A06E6665
+ C8B7B6161414070606B6A8A7F6E2E1EBD7D6E8D4D3ECD9D8EBD8D7E7D4D3E6D5
+ D4E8D6D5E5D3D2EBDAD9E9D7D6EBD9D8F1DFDEEDDBDAE7D5D4FDEBEA776E6D00
+ 0000776E6EF8E7E6EDDCDBECDCDAEADAD8EBDBDAE7D6D5E9D7D7EFDEDEF2E1E1
+ ECDAD9E8D5D4E7D3D2EAD7D6EBD7D6EAD6D5B6A6A6877C7A3A3434796D6DF5DE
+ DDEBD4D2EBD5D5EBD5D4E6D0CFE5CFCEE3CCCCE5CECDEFD7D6554C4CCBB4B4ED
+ D3D2EED4D3EBD1D0EFD4D3F4D8D67C6E6DAB96945D5151000000837271FFDEDC
+ EECFCDEFCFCDF0CFCDEFCFCCEDCBC9F2D0CEF3D0CEF4D0CDC6A9A7120F102721
+ 20030303BC9D9CF6CDCBF0C9C7EEC6C4ECC3C0EEC5C2EEC3C1EFC4C2ECBFBCEB
+ BCB9FECBC89E7D7C030202D1A09EF6B8B4EDB0ACF2B8B4F1BDB9F0BBB6F3BAB5
+ F3B3AEFFB8B49D767275524F7E53500E0606AF706BFFACA4FDB1A9FCABA3FE9C
+ 93FE988EFE9C93FF9E94FFAEA5FF9C92FEA79EFC9D94FFA69DEAACA45A3E3BA4
+ 6E694229275B4240FBAAA4F8AEA8F7B6B1F7B8B3F4B4AFF4B2ADEFABA7EAAAA6
+ F2BAB6AD8B888A716FAC8C8A000000544342F6C9C5EFC3C1EEC3C1EFC6C4F4CB
+ C8F0CAC8675756CAA9A7715E5D000000917B7AFBD6D4EBCAC8E8C8C6ECCDCCEF
+ D2D1F1D5D4EFD4D3EDD2D0F0D3D2EFD2D1EBD1CFF4D8D78D7E7DA29191807373
+ 000000786D6CFEE6E5EBD2D2E9D1D0EFD8D7F0D9D8F1DAD9ECD6D6EDD8D7ECD7
+ D7F4DFDEF1DDDC998D8D6C6362C4B4B42B2727050404A59797FCE9E8E9D5D5EC
+ D8D7E8D5D4E6D4D4EBD8D7E8D5D4E6D4D3E7D5D4E1CECEE4D3D1EBD9D9EEDDDB
+ F3E1E0FAE7E6F5E3E2FFF3F2796F6F000000776F6EFEEDEDEBDBDAECDCDAEEDD
+ DDF0E0DEE7D6D6DFCECDE2D1D1E7D5D5E8D5D4EDD9D9EFDBDAEEDAD9F2DDDCF0
+ DCDBEFDADA8B7F7E8074743A3434D9C3C3F7DFDEF1DBDAEAD4D3EFD9D8EBD4D4
+ EAD3D2F4DCDBE0C9C8262222D6BFBEE9D0CEEDD4D4E6CCCBEED3D2E1C8C7544A
+ 49CEB7B61E1A1A0000009F8A89F8D9D6EDCECCECCBCAEECFCCEBCBC9E7C6C4ED
+ CDCAF1D0CEECCAC8EDCAC83D34340000003D3433F1CBC9EFC9C7F1CCCAF1CBC8
+ ECC4C2ECC3C0EDC2BFECC0BEEEC1BEEBBCB9F4C1BDC59A98000000816361FFC7
+ C3F1C0BCF2C1BDF3BEBAF3BCB7F2B3AEF2B4AEF5BAB6FFB8B1A8736F69413E7D
+ 53502D1D1C916662FDAFA8FFAEA6FFA39BFD948BFCA198FC9E96FCA79FFDAAA2
+ FFABA3FFAAA2D48C86684441815F5B47302E644643FAA8A2FCB8B3F5AAA5F5AB
+ A7F4B6B1F5BAB5F6BCB7F4B9B5F1B4B0FEBFBBA07877826765AB8B8800000050
+ 4140FACECBF3C8C6F1C8C6FDD4D2DCB6B4725E5DAB908F8E7876000000675858
+ F6D3D1F2CFCEEECDCBEECDCBE7C6C5E8C8C7EBCDCCEDCFCEE9CDCCF0D4D3EFD4
+ D2EBD1D0F9DDDC6F63629B8B8B827474000000655B5AFEE5E4F3DBDAF1D9D8F1
+ D9D8F1DAD8F2DBDAFAE4E3F7E0DFE2CCCCC0AFAE7C7171817676928685181616
+ 211E1EB7A8A8F8E3E3EDDBD9E5D2D1E6D2D1E5D2D1E0CDCDE6D3D2E8D5D5E4D1
+ D0E7D5D4E4D2D1EAD8D7E7D5D4EAD7D7EAD8D7F0DDDCF5E3E2FEEFEF776E6E00
+ 0000736A6AF7E5E5DAC8C8E7D7D6EDDCDCEEDEDCEEDDDCE8D6D6DAC8C8D7C3C2
+ EBD8D7E8D5D3EEDAD9E9D6D4EEDAD9EDD9D8F3DFDEDFCBC9897C7B665C5C6258
+ 58CBB8B7F1DBDBE4CDCBF8E0DFE8D0CFEAD2D0EAD3D28074730B090ADFC9C8F1
+ D8D7F0D7D6F4D9D8FFE8E7A290906F6262BCA7A6000000000000BFA8A7FFE0DE
+ F5D5D4F2D3D1F3D2D0EECFCCEBCAC9EECDCBF0CFCDEFCECCFAD6D48673720000
+ 00957E7DF8D2CFE6C0BEEDC6C5F0C8C5EFC6C3F1C7C5EFC4C2E6B9B6EDBCB9F1
+ BEBBF6C0BCE5B1AE050404282020F7C7C4FECAC6F7C2BEF2BCB7F0B4AFEFB7B1
+ F1B7B2F3AFAAEDA39EFFA9A3D08F8A805653714E4B493432664744B57873EB98
+ 91FD9A92FFACA4FFABA3FFB2AAF3A49CDA928B9A646051363462403E513B3999
+ 706CFFB7B1FBAFA9F7ABA5F7BAB5EFAAA6EBA7A2F2B7B3F6BEBAF6BEBAF6BCB8
+ FFC4C08768667F6260AE88850000002C2524DDBBB9E1BDBBD5B1B0A68C8B7361
+ 608D7876564848010101715F5EFAD6D4F7D4D2F2D2D0EECECDECCCCBE9CAC8E8
+ C8C7EDCECDEED0CFEBCECDF3D7D6F6DAD8F8DCDBFFEDEC685D5CA594938B7C7C
+ 000000342E2EC5B2B1E0CBCAE8D1D0E7D1CFDDC9C7D2BEBEC8B6B6978A896D62
+ 62635A5A665D5D474141201E1E796E6DCEBBBAF8E3E3F0DDDDE9D6D5E9D7D6E8
+ D5D5E7D4D4E3D0CFE3D0CFE7D4D3E4D0CFE6D3D2E1CFCEE8D5D5DCC9C9DFCDCD
+ E2D1D1DECCCCF4E4E3FCECEB746B6A000000766D6DF9E7E5D6C4C4E7D5D4E0CF
+ CFDFCECDE2D0D0EAD8D7D7C4C3DAC6C5EBD8D7D8C5C4E0CDCCE5D1CFE5D2D1DB
+ C7C6E9D5D4ECD6D5D5BFBD9C8C8B605656534B4B8276768B7C7C8E81806E6261
+ 5047471A1717000000020201CFB9B7E7CFCED9C3C2A794948576752E29294840
+ 3F4941400303030404045046467B6C6B998584AF9896CCB1AFDCBCBAE1C1C0E3
+ C3C2E0C0BEE7C7C5E9C8C6BEA2A01F1A1ADCBCBAF2CDCAEAC4C1EAC3C0E4BDBA
+ E5BDBAE2B7B4EABDBAD5A9A7B8908EA2807E8E706E6F58560F0C0C0202026551
+ 4F997977BA908EECB5B1F1BEBAECB5B1EBABA6EEAAA5EB9D99EDA39EF6ABA6F1
+ A59FB886818A615D6346424A312F5539366A413D724A47734B476D4D4A62423F
+ 4C34325238366342408C605CDF9791FFC0BAFAB3ADEFADA8EFA8A3EEA7A3EDB5
+ B0EBABA8F1AFABE5AEAAC399969676736F56542E242430252540323104030306
+ 040413100F2D26254A3F3E4E4342504342372E2D4C403FB39795F3CFCDEDCAC8
+ E1BFBDEECCCAF1D0CFECCDCBE1C3C1EBCDCCE8CAC9E9CDCBE6CAC9CDB4B3AB95
+ 94917F7F7A6C6C201D1C554C4C463F3F0404040202020A09091211112F2A2A55
+ 4D4C3D3737342F2F3631313F39393731304841415950508B7E7DDCC8C8FBE4E4
+ DAC5C4E5D1D0E2CFCEDAC5C4DCC8C7E5D2D1D9C6C5D9C6C5E1CECCDECAC9D7C3
+ C2E4D1D0D7C4C5E4D2D1E1D0CFDFCFCEE1D0CFD6C5C4E9D8D7EEDCDB6C636200
+ 0000776E6EF2E0DFD4C3C2E0CFCED9C7C7DDCBCAEAD8D7E8D6D5D7C4C3DAC6C5
+ E4D1D0D8C4C3EEDAD9E4D0CFD9C6C5D6C2C1EBD7D7E3CDCCDAC4C1FAE2E0DEC9
+ C8B0A09F8F82828779788377766F64628B7E7D9284839081818B7D7CD6C0BEEE
+ D5D5DDC6C5B29F9DA39190BDA8A7B39E9DB29E9DB5A09FC1AAA9AD97969D8988
+ AA9493BCA4A2C4ABAAD6B8B7EDCFCDEACBCADFC0BEE0C0BFE3C2C0E6C4C3B49A
+ 99EECAC8EDC8C6ECC7C4E5BFBCE3BBB9EBC1BFDDB1AFEDC0BDCCA4A2BB9795AE
+ 8D8BAC8E8CAD8E8DBB9896BD9A97A98684B08886BC9391DEB1AEECB7B4EDB1AD
+ EBADA9ECA4A0ECA6A1EFACA7ECA39EF0AEA9F8B2ACF1ACA6DB9892BE817C8D5D
+ 5A8658544E3533412A296B4D4A885F5CA67470CD908BEEA29DFAADA7FAACA7EE
+ ABA5F1B7B1EDA8A3F5B9B4EBA6A1ECABA6EBB4B0F3B7B3D09794B88B88AF8886
+ AE8A88B89491B69290AE8B88BE9895C09A98B18C8AC29D9BBB9897AF9392C3A8
+ A6DCBCBBF2CFCDEAC5C3EFCCCBE2BFBEDCBAB8EECECCF2D3D1ECCCCBDEBEBDE1
+ C3C2E4C8C6EDD1D0DFC4C4C9B2B2B49E9DAB9796A28F8EB09C9BB09D9CB2A09F
+ B8A3A3B4A09FB6A3A2AF9E9DBAA7A7AF9C9BC2AFAEC1AFAEB1A1A0B6A4A3C7B3
+ B2E2CDCCE5CFCEEDD8D6FAE4E3EDD7D6D6C1C0E3CFCEE0CCCBDEC9C7E5D1D0E7
+ D2D1D4BFBED8C3C2E3CFCED4C1C0D4C0BFE4D0CFD4C1BFE2D0CFE2D1D0E0CFCF
+ E3D1D0DBCAC9F0DEDEE9D6D56F6766000000736B6BE9D7D6E8D6D5D7C5C4DAC8
+ C7DBC9C8E5D3D3DDCBCAE3D0CFE4D1CFDCC8C7DCC8C7E6D1D0E0CDCBD9C6C5DF
+ CBCAE2CECCDBC6C5A89897736969988A8AD6C3C2F2DDDCE7D1CFE1CBC9897B79
+ 978887DFC8C7EBD2D2F0D7D6E0C8C7B7A4A3786C6BAF9C9BD5BEBD887A798374
+ 74AA9795A491908676759D8A89ECCFCEE5C8C6F1D3D2F0D2D1DDBFBDE4C7C5E7
+ C9C7E0C1BFDDBCBADFBDBBEDCBC9F2CFCEE9C7C5EDCAC8E9C4C1E2BBB9E3BAB8
+ ECC1C0DDB3B1E5BBB9E5BCB9EBC2BFE9BFBCEFC3C0EFC3C0F1C7C3F8C9C6EFBC
+ B9F0BFBCF1C3C0EAB6B2EAB2AEEDB3B0E9A7A3ECAAA5ECAEAAF0ABA7EDABA6EF
+ B1ACEDAAA5EEACA6F4A8A2FFB4AEFCA69FFCABA4F2A59FF6A39DF9B4AEFFB6AF
+ FAADA7FBB2ACF9B0AAECA29DF3AEA9ECA49FEEB6B1EBB1ACF2B2ADEAB1ACF0AF
+ AAE9ABA7F1BDB9EAB3AFECB0ACFAC2BFFBC7C4FACAC7F8C8C5EDBEBCF0C2BFF6
+ C7C5EDBEBCF3C4C2ECC0BEF0C4C3ECC4C2E7C4C2E8C9C7E2C4C3E9C9C7E2C0BE
+ E3C1C0E6C6C3F4D6D4EED0CEDDBEBDDFC1BFE3C5C4EED1D0E0C5C4EFD3D2E8CC
+ CBEBD1D0E6CBCAEED4D3F7DEDDF2DAD9ECD3D2E8CFCEF1D8D6E7CECDF2D9D7E1
+ C8C7F3DAD9F7E0DFECD5D4E2CCCCE2CCCBDFCAC9DFCAC8DCC7C6E7D1CFDDC7C6
+ E2CCCBD8C3C2DDC8C6DEC8C7E1CCCBDAC6C4DBC6C5DAC5C4DECAC8D5C2C0DBC7
+ C5DFCBCAD5C1C0DFCCCCDBC9C8DECBCAE0CECDD9C7C6E7D6D5E3D0CF6C636200
+ 00006C6464E9D7D7EDDDDCDCCBCADECDCCDECCCBE1CFCEDCCAC9E2CFCFE8D5D5
+ D8C4C4DAC6C6DECACADAC6C6DFCBCAE5D2D1DECAC9DECAC9DAC8C73935359286
+ 86E5D2D1E0CCCBE5D0CFEDD7D6544C4B766B6BE7D0CFE1CACAE4CDCCE3CCCCCD
+ B8B7221F1FBCA8A7EDD4D35149486C605FD6BEBDCFB7B6C1ABAA635858CFB7B6
+ E3C8C7E9CDCCEBCDCBE2C4C2DFC0BFE3C4C2E3C4C1E8C8C6DFBEBCE8C7C5EBCA
+ C8E9C6C4E8C4C2E3BDBAE0B9B6E0B9B6E6BFBDE4BDBBE6C1BFE4BEBBF0C8C6ED
+ C3C0E6BDBAE8BFBDEBBFBCEEBFBCEBBEBCEABFBCE9B7B4EBB5B2EEB7B3ECAEAB
+ ECACA8EEB3AFF1B2AEEBAAA6EEB4AFF2B3AEEEAFAAEFADA7EDA5A0F5B0AAF4A4
+ 9EF0A7A1F1A7A1F9ACA6F5B4AEF1AFA9F2ACA6F6B3ADF6B3AEF1A9A4F2B0ABED
+ A9A4F2B3AEF0BEB9ECAFABEBAFABF0B9B5E9AAA7E9AFABEEBDB9EEBBB7E9B1AE
+ E8B3B0F0C1BDF2C4C1E9BCBAE7BDBBE9BFBCE8BEBCE7BDBAE4BBB9E8C0BEE8C0
+ BFE5BEBDE9C5C3E7C6C5E6C9C8E9CBCAE7C9C7E7C7C5EFCFCDEDCECDDFC2C0E4
+ C7C6E0C3C2E9CDCBE9CDCCE2C6C6E4C9C8E9CFCEE3C9C8EAD1D0ECD4D3E5CECE
+ E4CCCCE0C9C8EBD3D2E5CECDE3CAC9E3CACAEDD5D4EED7D6E0CAC9E9D2D2EDD7
+ D6E4CECDE6D1D0E0CAC9E3CDCCE2CDCCE3CDCCD8C2C1DFC9C8DAC5C3DBC6C5DB
+ C7C5E5D0CFDEC9C8DFCBCAE0CCCBE3D0CFE2CECDDECACAE0CDCDE1CFCFE6D4D3
+ DDCACAE5D3D2EEDDDCEEDBDA756C6C000000746C6BF7E5E5E9D9D8E7D6D6E9D8
+ D7EDDBDAF1DFDEF2E0DFF1DDDDF4E1E1EAD6D6ECD9D8F2DFDEEEDBD9EEDBDAEA
+ D7D6E9D7D6E9D7D6EDDADA585152AEA1A0F2E0DFE5D2D2EAD7D7F9E3E36E6564
+ 8A7E7EF4DCDCE2CCCBE2CCCBECD5D5E6D0CE403A3AD4BEBEFCE1E17065648779
+ 77F7DDDCE8CECDF4D9D7D3BCBBD7BFBEE8CCCBEDD0CEF1D3D1F5D6D4F2D3D2ED
+ CECCEECFCDEBCBC9E6C5C3EDCCC9EBC8C6EBC7C6EBC5C4E8C3C0EDC8C5EDC8C5
+ EFCBC9EFCCCAF1CCCBF0C9C7F0C8C6EFC8C5EFC6C3EEC1BFEEC1BFEAC1BEEAC1
+ BEECBBB8EFBCB9F1BEBAEFB6B2EFB3AFF0B7B3EDB2AFF2B4B0F2B9B5F1B9B5F3
+ B5B0F4B8B3F5B3AEF6B1ACF8B4AFF9ADA7F8B3ADF5ADA7F7ADA7F6B7B1F8BAB4
+ F8B3AEF5B4AFF2B1ACF2AEAAF4B3AEF4B6B1F4B3AFF5BEB9F3C1BCF2B6B2F4BD
+ BAF4BEBBF6BAB6F6BFBBEABBB7E9B9B5EDB9B6F2BFBCF6C7C5F1C4C1F1C7C4F3
+ C9C7EEC5C3F3CCC9EEC6C5EFC8C6F3CCCAF1CBC9EFCAC9EDC8C7EFCCCBF2D3D1
+ EED1CFF2D7D4EDD0CEEFD1CFF1D3D2EFD1D0F1D4D2EACECCEED2D1EACFCEE8CD
+ CCE5CBC9EAD0CFECD3D2EDD4D3E6CECDEED6D5EAD3D2EBD3D2EDD5D4F0D7D6F0
+ D6D6EBD3D1EFD7D6F1DAD9F0DAD9EFD8D7F4DDDCF7DFDFF4DDDCF1DBDAF3DDDC
+ EFD8D7EFD8D7F0DAD8EAD5D4E7D1CFEAD5D4EAD6D5E2CDCDE9D4D4E3CFCEE9D5
+ D4EAD7D6E7D5D4EDDBDAEEDCDCF4E3E2EDDCDBEFDEDEEEDDDDF9E7E778707000
+ 0000756D6DFEEDEBE7D6D6E5D4D4E5D3D2E4D0D0E6D4D3E4D2D1EAD7D6E8D6D4
+ E3D0D0E4D1D0E5D3D2E7D4D3EBD9D8EAD8D8E8D7D6EAD8D7EDDBDB575051AA9D
+ 9DEFDDDCE6D4D3E9D6D6F7E2E16D63638F8282FFEBEBF2DCDBF1DAD9F3DBDAED
+ D6D5403939CCB7B6F8DFDD6C6161897B7BF9DFDEF2D7D7D1BBB9E4CBCAEDD2D1
+ E7CCCBECCFCEF0D2D1EDCFCDEDCFCEE6C8C7ECCCCBECCCCAE6C4C3E8C7C5EBC8
+ C7EBC8C6EECBC9EAC7C5EBC9C7E7C5C3E9C6C4E9C5C2ECC7C5EDC7C5ECC5C3E7
+ BEBCEBBFBDEBC1BEEEC7C4EEC4C2EDBEBBECBDBAEEBEBBF1BBB8EFB6B3F0BAB6
+ F0B9B6EEB3AFF0B6B2F2BEBAF2B8B4F1B9B4F2B6B2F5B3AEF4B3AFF3AFABF5AC
+ A6F8B7B2F2ACA7F3AEA9F0B1ACF4B8B2F3B0ABF6B8B3F1B1ACF2B4AFF2B1ADF2
+ B7B3F3B5B2F5BAB6F2C2BEEDB9B5F2BAB6F0BDB9F1BEBBF3BAB7ECB8B5E9BCB8
+ E9BCB9EEBDBAF5C4C0F2C4C2F3C9C6F2C9C6ECC4C3F2CCCAF0CAC8EDC7C6EFCA
+ C8F0CACAEFCBCAEDC9C8EECAC9F0CCCBEECCCBF0D2CFEFD4D2EFD4D2F1D7D6EF
+ D3D1F1D5D3EED1D0EBCFCEF1D5D3EDD3D2E5CBCAEBD1D0EED5D4EED6D5EBD3D2
+ EFD7D5ECD4D2E4CAC9EAD0CFE8CFCDE7CECCE2C9C7E6CECEE9D2D2EBD4D3E4CD
+ CCE8D2D1EFD9D8EDD6D5E6D0CFE6D0CFE7D1CFE6D0CFE7D0CFE9D3D2E3CECDE2
+ CDCCE5D1D0E3CECCE7D2D1E3CFCEE9D6D5E8D5D4DFCDCCEBD9D8E7D6D5EDDCDB
+ EFDEDDF1E0DFF0E0E0FEEDED766E6D000000766E6EFFF0EFEEDCDCE7D6D5E9D6
+ D5E2CDCCE3D0CFDECCCBEAD7D7EEDCDAE8D5D4E9D7D6E8D6D5EAD8D7E7D6D6E7
+ D6D5E1CFCEE7D4D4ECDADA565050A99C9CF0DDDDE6D3D3E7D4D3F7E1E1706666
+ 4B44448A7D7D8478788477778376757D7170292424CFBBBAF7DFDE6F64645950
+ 50AA9898A392914B4343D0BAB9ECD3D2E8CECDE7CCCBEDD1D0ECCFCEEED0CFEA
+ CBCAEFCFCEEECECDEBCBC9E7C5C5EAC9C8EAC8C7EBCAC9EECECDEDCDCBEBC9C7
+ EAC7C5EAC6C4EECAC8ECC7C5F0C8C7EFC6C3EFC7C5F0CBC9F1C8C6EEC2BFE9BC
+ BAECBEBBECB9B7ECB6B3EDB9B6F0BDBBF0B9B5EFB8B4F1BDBAF1BCB8F2BAB6F5
+ BEBAF6BBB7F7B7B3F8BCB8F5B2AEF2AEA9F6B9B5F4B1ADF2B0ACEDB2ADF1B9B4
+ F4B5B1F5B9B4F5B8B4F2B8B3F0B2ADEEB4B0F0B7B3F1B6B3F2BEBAF1C4C1F0BC
+ B9EEBAB6F1C2BEEEBCBAEFBAB8F3C2C0F0C5C3EDC3C0EFC1BEEEBFBDEEC3C1EE
+ C6C4E9C2C0EBC6C4EDC9C7EBC7C6EDCAC8EDCAC9EDCBC9E8C6C5EAC8C7EECCCC
+ ECCBCAECCBCAEDCDCCEDD0CEECD2D0E7CECDF0D6D5EED4D3EBD0CFF3D6D4F4D8
+ D6EDD1D0E2C8C7E6CCCBEED6D5EAD1D0EED4D3ECD3D1E9CECDEDD3D2EBD2D1EE
+ D5D4ECD4D2EFD7D6EDD7D5EED8D7E8D1D1E6D0CFECD7D6EED8D7EAD5D4E8D2D1
+ E9D2D1EBD5D3EDD6D5EDD6D5EAD4D3E6D2D0E5D0CFE3CECCE8D5D3E6D3D2E6D4
+ D2E8D5D5E3D1D0EBDAD9E8D8D7EBDBDAEDDCDCF0DFDFF2E2E1FFF0F079717100
+ 0000746C6BFAE8E7E6D5D4E9D7D6EFDAD9F1DDDCEEDBDAE7D4D4F2DFDEEEDCDB
+ E3D1D0E8D6D5E9D7D6E6D3D3E9D7D6E7D5D4D9C7C7E4D2D2EAD7D6564F4FA79A
+ 9AEAD7D7E2CFCFE2CFCFF5DFDF6E6564766C6BD4C1C0C4B1B0CAB7B6C8B5B4BD
+ ABAB363130C7B4B3F7DFDE6E6362796C6CDEC7C6D7C0BF9D8D8CD6BFBEE9CFCE
+ E8CDCDE0C4C3E6CAC9E3C6C6ECCECDE4C5C3E7C8C6E7C8C6ECCCCBE7C8C6E6C7
+ C5E8C9C7E9C9C7E8C9C7ECCBC9E9C6C5ECCBC9EAC8C7ECC8C5EAC4C2EDC7C4EA
+ C4C2EECAC7EDC4C2EDC1BEEDC1BFEBBFBCECBCB9EDBAB8EEBCB9EFBEBBEBB7B4
+ EBB5B3F1BDBAF0BFBDF2BCB8EFBAB7EFB9B4F4BBB6F1B4B0EEB5B1F2B2ADF3B2
+ AEF4BBB7F4B4AFF4B5B1F1B7B3EDB8B3F2B6B2F4B9B5F2B9B5F0B7B3EEB4B0EF
+ B4B1F3BDB9F5BDB9F0B9B5F2C5C2F2C5C3F0BEBBF2C2BEEDC1BFEDBDBBF4C1BE
+ F0C2BFEDC3C0F2C9C6F0C5C2F0C4C2F0C7C5EEC7C5ECC7C5EDC9C7E7C5C3EBC9
+ C8E9C6C5E9C9C7DFBEBDE7C6C5EECECDE5C5C4EAC9C9E7C8C7E6C8C7E1C5C4E0
+ C5C5EBD1D0EED6D6EAD2D1EED5D4F0D6D5E9CECCEBD0CFDCC2C1E4CBC9E1C8C6
+ E9CFCEE3CAC8DFC7C5E7CFCCE4CBC9E5CCCAE2CAC9E5CDCBEFD7D5E8D1D0EBD4
+ D3E7D1D1EDD7D6EBD6D5E7D1D0E6CFCFE6D0CEE5CECEE6D0CEE6CFCEE9D2D1E4
+ CFCDE4CFCEEAD5D4E3D0CFEBD8D7EBD8D7E6D4D3DCCACAE6D4D4E4D3D2E6D5D5
+ EBDBDAE6D7D6EBDBDAFEF0EF7971710000006E6665E5D3D2E4D2D1DCC8C6D3C0
+ BEEFDBD9D7C5C4DECCCCE6D5D3DDCBCAE4D2D1E8D5D5DFCCCBDECCCBDCCBCAEE
+ DCDBDECCCBE4D1D0E1CFCE524B4AA69999E5D2D2E0CDCDDFCCCCF2DDDD69605F
+ 8A7F7EF1DBDAE2CCCBE2CCCBE4CFCEDCC8C73D3736CBB7B6F7DEDD6E63638173
+ 72EED5D4E0C8C7E9D1D0DCC4C3DFC5C4DDC3C1DCC0BFEBCFCEE7CAC9E9CBC9DD
+ BFBDE2C4C2E4C6C4EFD0CEE1C3C2E2C5C3E2C3C1EECDCBDDBCBAE3C3C1E6C5C4
+ DFBEBCE3BFBDDEB9B7EBC6C4E8C4C2E3BFBDE9C2BFE4BAB8E5BBB8E3B7B5E9BA
+ B8E3B2AFEEBCBAEEC0BDE8B7B4E3B0ADEAB8B4EDBEBBE5B4B0ECB9B5E9B7B3E8
+ B3AFEDB4B0E8AEABEBB2ADEDAEAAE5A7A3EBB3AEEAACA8EBAFAAEEB5B2E7B2AE
+ E8AFABF0B8B4E9B3AFEDB6B2ECB6B2E7ADA9E9B5B1EEB8B5E3ADA9EBB9B6F0C6
+ C3F0C3C0EABAB6E5B7B5E6BBB8EDBEBBE5B6B3E6B9B6EDC5C3E3BDBBE9C0BEF1
+ C7C5EDC5C4F2CCCAE9C5C4E3C0C0E7C5C4E0C0BFEBCCCAE0C1C0E7C8C7ECCDCB
+ DBBBBAE9CAC9E9CCCAE6C9C8E3C6C5E1C4C4E2C6C6E4CBCAE1C9C8E0C9C8E0C9
+ C8E0C8C6EAD0CEDBC3C1DDC4C3E2CAC8E2C9C7DDC4C3DAC1BFE5CCCBDCC3C2DC
+ C4C2D9C1C0DBC3C1EBD4D3DCC5C3E7D0CFDEC8C7E1CBCAD9C4C2E5D0CFE6D0CF
+ D2BDBCE5D0CEF1DBD9EFD9D7E3CDCBD0BAB9DBC5C4DAC6C4DCC9C7DCC8C7EEDB
+ DADBC8C7DBC9C8DAC9C9E6D5D5E7D6D5EDDDDCD8C9C8D9C8C8ECDAD9766E6D00
+ 0000736A6AE6D2D0F6E2E1E2CECDD9C6C4ECD9D8DAC8C7DECDCCE6D5D4DECCCB
+ EEDCDBE8D5D5D8C5C5EFDDDCE2D1CFC5B5B5BEAEACE8D5D6DECCCC4741419C8F
+ 8FE5D3D3CABABAB1A2A2FDE8E75C5454776D6DE2CBCAEAD5D4E2CDCDDAC4C3D1
+ BCBC2E2A2AC9B6B5F6DDDD615757756867EDD4D3DCC3C2CEB7B6968584E4CBCA
+ E3C8C7DDC2C1EED1D0E6CAC9E1C5C3DFC2C1E9CBCADEC2C0E6CAC9E2C6C4F0D1
+ D0DEBDBBE9C9C7DDBEBBE4C4C2E7C6C4E0BDBBE9C5C3DEBAB8EFCDCAE4C2C0EB
+ C4C2E7BFBCE7BEBCE8BEBBE6B9B7EBBBB9E1B2AFF1C4C2F1C3BFE5B4B2E3B1AE
+ EEC0BCEEC0BDE7B5B2E9B8B5E9B8B4F2BEBAE6AEAAE9B3AFECB3AFF3B7B3EBB2
+ AEEAB3B0EBAFABF1B8B4E9B2AFEFBCB9ECB6B2ECB5B1EBB6B3EFBAB6F1BEBAE8
+ B1ADEEB9B5EDBBB8E2AEABE8B5B1F2C4C1F1C8C5E6B8B6E6B7B4EABFBCEEC4C1
+ E8BAB8EABCB9EBC0BEE2BDBBE4BFBEF0C9C7EEC7C5F4CDCAE7C2C0E6C3C2EECC
+ CBE2C2C0EDCDCCE1C1C0E3C4C3E5C6C5DFC0C0E6C9C8EED1D0E9CDCBE4C7C6E6
+ CAC9EACFCEDFC5C4DEC3C3E9CFCEE6CFCEE3CCCBE4CDCBE1CAC8E4CCCBE1C8C7
+ E0C8C6E3C9C9E1C8C6E0C7C6DDC5C3E0C9C7DBC3C2E1CBC9E9D2D1DAC4C2E4CE
+ CDDAC5C3E3CECCD9C4C2E4CFCEDFCBC9D8C2C1DFCAC9F0DBDAF4DFDDEED9D7D6
+ C1C0EAD5D4D6C3C2E8D6D5D7C4C3E4D2D1D6C3C3EEDCDBDBCBCAE2D2D2EFDFDE
+ E6D6D5D8C8C8EADADAE9D9D86F67670000006A6160DDC9C8E3D0CFDAC7C6D5C3
+ C2DBCAC9DDCCCBDECDCCDECDCDD9C8C7DCCACADFCDCCD7C5C4EFDCDCDFCECDBD
+ AFAE635B59A699989C8F8E696161877B7BA39696807575796F6EDAC8C7655B5A
+ 6B6160C8B3B3E0CBC9DCC7C7DEC8C7AD9B9B504847968786D2BDBC7166657C6F
+ 6EA49291A08D8C877877877776EBD1D0E2C7C6DFC4C3EDD2D1E5CAC9E3C9C8DF
+ C4C3E0C5C4E3C7C6E2C5C4E4C6C4EBCCCADCBDBBDEC0BEE2C3C1E3C1C0E4C0BF
+ E1BEBCE4C1BFDBBAB8EBC9C7DFB9B7E7BFBDE9C1BFE1B9B7E2B8B5E3B5B3E6B8
+ B6DFB4B1F4C8C5F5C6C3E7B6B3DEB0ADE5B9B6E7B9B6E4B4B2E7B9B6E6B4B1E8
+ B5B1E5B0ACEAB7B3E6ADAAE8AEAAF4BDB9E3ADAAE5ABA8F0BAB6E6B0ADE9B9B6
+ E8B5B2E8B3AFE9B7B4E7B4B0EAB8B4E5B2AEEAB5B2E7B6B3EAB8B5E3B1AEEDBD
+ B9F1C7C4E9C0BDE5B7B5E4B7B4E8BFBDE6BDBBE6BBB8E3B8B6EAC2C1E4C0BEE6
+ C3C1EFCAC8EFC8C6E1BCBAE5C1BFE9C8C6DEBEBDE8C8C7E0C1C0E5C7C6DCBFBD
+ E8CBCBDFC4C3ECD0D0ECD0CFE4C8C8E3C8C7E4CAC9E4C9C9E3C8C8DFC4C3DFC5
+ C4E2C9C8E5CDCCDDC6C6DFC8C7DDC5C3DBC3C2E0C8C7E6CECDD7BFBEDFC7C6E9
+ D2D1D8C2C1DCC5C4E2CDCBDAC6C5E7D3D1DCC9C7E0CDCBDAC6C5E4D0CFD9C5C4
+ E4CFCED7C3C2EBD8D7EEDBDAE2D0D0D5C3C3E6D3D4DAC8C7DAC8C8D9C8C7E8D7
+ D6D6C5C5EAD9D9D8C8C8E1D2D1E8D8D8DECFCFD7C8C8E4D5D4E9D9D96C646400
+ 0000706766F0DDDBE2CECDE4D1CFE2D0CEE5D3D2E7D6D5E4D2D2E5D5D4E3D1D0
+ E6D4D3E5D3D2E3D1D0EEDDDCE1CFCEE3D0D0E1CECDE9D7D6DECCCAE8D5D4E2CF
+ CFDDCBCAE2CFCEE1CDCBDFCAC8E0CAC8EAD3D2EAD4D3E4CFCDE8D2D2E5D0CEDB
+ C5C4E6CFCEDFC8C8DFC8C7EBD4D2E3CCCBD9C1C0DEC6C4E8CECCE5CACAE9CFCE
+ E3CAC9E3C9C8EBD2D1EAD1D0E9D0CFE3CACAE6CCCAECCFCEE3C5C4E9CBC9E8CB
+ C9E4C7C5E3C4C2EAC9C7E9C7C5EBC9C7E9C8C7E9C9C7E9C8C5F0CAC8E3BDBBE5
+ BFBDEAC4C1E7BEBBEABFBDECC0BEECC1BFE9BFBCF1C4C2F0C2BFEEC1BEE9BFBC
+ EBC1BDECBEBBEBBEBBECBFBCEBBAB7E9B7B4EEBBB8F2C0BDEEB7B4EFB7B3F7C3
+ BFE4B0ACE7B0ACEFBBB6E5B2AFEDC0BCE9B8B4EAB6B2F0BFBCECBBB8EFBEBBEF
+ BEBBEDB9B6EBBBB8F0C1BEECBCB9EFBFBCEDC1BEEBC4C1EAC1BEEABDBAECC1BF
+ ECC5C2F0C8C6E7BEBBEAC1BFE8C1BFE7C5C2EFCCCAECC8C6E7C2C0E6C1BFECC9
+ C8E8C8C6E8C9C7E8CAC9E8CAC9E4C7C6E7CCCBE8CCCBEDD3D2EFD4D4E4CAC9E2
+ C8C7E2C8C7E1C8C8ECD2D2E5CBCAE5CBCAE8CECDEED4D3E3C9C8E3CAC9E3CBCA
+ E3CCCBE3CCCBE8D1D0D7C0BFE1CAC9ECD5D5E4CECDE2CCCBE5CFCEE7D2D2EAD5
+ D4E3CECEDFCBCAE0CCCBDFCBCAE2CECDE5D1D0DFCCCBE8D6D5E9D7D6E0CECEDF
+ CCCCEEDBDBEFDEDDE1CFCEE7D5D4ECDBDAE1D0D0EEDDDDE1D1D0EADADAEADCDC
+ E2D4D5DCCCCDEFDFDFEBDCDB706969000000776E6DFFF1EFF2E1DFF5E1E0F1DF
+ DDEDDBDAEDDBDAECDBDAEFDDDDEFDDDCF1DFDEEFDEDDF3E1E1F1DFDEECDAD9ED
+ DAD9F4E1E0EFDBDBF2DEDDF3DFDEEBD6D5ECD7D5F2DCDBF1DBDAEBD6D4E7D1D0
+ F0DAD9EDD7D5EAD5D4EED8D8E7D1D1E8D2D1EFD8D7EFD7D6E6CECEEDD4D5EBD3
+ D2EBD2D0EDD3D2EFD4D3E9CFCEE6CDCDE9D1D0E7CECDEAD1D0EAD1D1E9D0CFE2
+ C8C7E0C5C4E2C6C5E4C7C5ECD0CEEFD2D0EED0CEEBCBC9E9C9C8EBCAC9E8C8C6
+ ECCDCBEECCC9EECAC7F4CFCEF1CCCAEBC7C4EDC6C3ECC3C0EEC4C1EDC4C2EEC6
+ C4F2C9C7F2C7C5EFC4C1F2C8C6F1C8C6F2C6C3F4C7C4F0C5C2EFC2BFEFBFBCF0
+ BEBBF0BFBCF2C0BDEEB8B6EFB9B6ECBAB7DFACA8ECB7B4EFBCB9E8B6B3E6BBB8
+ E6B6B3EAB8B5EFC0BEF0C1BEEFC0BDF3C4C0EDBCB9EBBAB9EEC1BFEFC2BFEFC1
+ BEEEC1BEEAC2BFEFC9C7F0C7C4EBBFBDE4BCB9EAC3C1F0C9C7EFC8C6EFC8C6EF
+ CAC8EFCDCCEFCDCCF2D0CFEECBC9F1CDCCF2CFCDF2D3D1F2D4D3EBCECDEED1D0
+ EACFCEEFD4D3E8CECDEAD0CFE9CECEE0C6C6E0C7C6E1C7C7EDD3D3F0D6D5EDD4
+ D3EDD2D1F1D5D3E9CDCCEDD2D1EBD1D0EED5D4EDD6D5DFC9C8D8C3C1E8D2D1EA
+ D4D3EDD7D6F3DDDCEFD9D8F0DCDBEDD9D8EAD6D5E8D4D4E9D5D4E6D3D1E9D6D5
+ E6D2D1E8D6D5E7D4D4E8D6D4EDDADAE3D0CFE7D5D3F1DEDEE5D2D2EAD8D7ECDB
+ DAE4D3D3E5D6D6E9DAD9EADADAE6D8D8EBDEDEDBCCCCE2D3D3EBDBDB766F6E00
+ 00006F6665F3E0DFE9D7D6EBD8D7EDDBD9EFDDDCEDDCDBEBDADAE8D7D6E9D8D7
+ EFDEDDECDADAEDDBDBEFDDDCE3D1D0EAD7D6F1DDDBF0DBD9F6E1DFF7E2E0EED7
+ D6ECD6D4EED7D6EED8D6EBD5D3E9D2D2EED8D7F0DBDAEED8D8EDD8D7E5CFCEE7
+ D0CFE8D1D1EBD4D3E2CAC9E9D1D0ECD4D3E8CFCEE9D0CEF2D8D7E6CECCE9D0CF
+ E9D1D0E8D0CFE9D1D0E9D0CFECD2D1E7CCCBE3C8C7E8CDCBE0C4C2E4C7C5E6C8
+ C6EACBC9EECECCE9CAC8ECCDCCEECFCDEECDCBEBC8C6ECC8C6F3CFCDEFCBC9EA
+ C5C2EAC3C1EAC2C0EDC5C3E9C4C2EAC2C0EDC4C2EDC3C1EEC5C2EEC6C4EBC3C1
+ EBC0BDF4C8C6EFC4C2F0C3C1F0C1BEF0BEBBEEC0BDF1C0BCEFBCB9EFBCB9EFC1
+ BDEBBAB7F3C0BDEFBEBBEFC0BDE7BDBAEBBDBAEDBDBAEDBFBCECBFBCECBEBAED
+ BFBBEDBFBCECBBB8EBBFBDECC1BEEDC1BEECC0BEEBC1BEEEC8C5EFC9C6EFC7C4
+ E8BFBCEFC8C5F2CDCAF4CECBF1C9C7F0C9C8F1CDCBF0CFCDEFCFCEEECECCF2D0
+ CEF3CFCDF2D0CEF2D2D1E8CBCAEACECDEACECDEDD2D1EBD0CFE4CBCAEED4D3E6
+ CDCCE3CAC9E4CAC9E8CECEE9CFCEE9CECDE8CDCCEFD4D3EDD2D0EBD1CFE9CFCE
+ E9D0CFEED6D5E5CECDE5D0CFEED9D8EED9D8ECD7D6EED9D7EAD5D4EED8D7ECD8
+ D7EAD6D5E8D4D3E6D2D2E2CECDE7D3D2E6D3D2E5D4D3E9D6D6E8D6D5ECDAD9F0
+ DCDCEFDDDCF4E1E1EDDCDBF1E0DFF2E0DFECDCDBE4D5D5E6D6D6EDDEDDE4D5D5
+ ECDEDDE8D9D9DBCDCDF7E6E6776F6F000000746B6BFCE9E8EDDBD9E8D6D4E7D5
+ D4E3D1D0E3D2D1EFDEDDEAD9D8EBDAD9F0DFDEEFDEDDEDDCDBF0DDDDE9D7D6EE
+ DBDAF1DBD9F3DDDCE7D1CFDFC9C7D9C3C1E6D1D0E9D3D3E8D3D2E6D1D0E6D0CF
+ EAD4D2EDD8D6E0CAC9E6D1D1EAD4D4EED8D7EDD6D6EED7D6ECD5D4E3CCCBE6CE
+ CDF0D7D6ECD2D1F2D9D8EAD3D2E6CFCDEAD3D2E9D1D0E6CDCDE7CDCCEBD1D0E4
+ CAC9EBD1D0EFD4D3EBCFCDEBCDCCECCDCCE8C9C7E0C2C0E9CCCAE8CBC9EAC9C8
+ EECBC9EAC7C5E9C5C4F1CECCEFCAC8EAC4C3ECC5C3E8C2C0EAC4C2EBC6C3EBC3
+ C1E2BAB7E6BEBDEDC7C5EFC9C6EFC6C4ECC1BFEDC5C2ECC2BFEEC3C0EEC0BDEF
+ C0BEECC0BDEFBEBCF0BFBCEEBEBBF2C5C2F3C2BFEEBEBBEABBB8EEBEBCEAC0BD
+ EBC0BCEABDBAEDBFBCEEC2BFF0C3C0F0C3C0EDC2BEEBBDBAE8BCBAE9BFBDEEC3
+ C1EDC2BFE4B9B7EDC6C4EDCAC7ECC7C4EAC2BFF2CAC8F1CCCAE8C4C1EFCAC8F2
+ CAC9EEC9C6EFCDCAEAC9C7ECCCCBF3D2D0EAC8C6E0BDBBE3C2C0EACBCAECD0CF
+ EED3D1EFD3D2E3C9C7E8CECDF2D9D7F1D8D7EDD4D3E8CFCEF1D7D7F2D8D7EED3
+ D2EBD1CFECD2D0EED3D2E6CCCBE7CECDE2C9C7E5CCCBF0D9D7ECD5D4E9D3D1EF
+ DBDAECD7D6ECD8D7EAD6D5DCC8C7E5D0D0EBD6D5EBD6D6ECD7D7E5D2D1E4D0D0
+ DFCCCBDECCCBE8D6D6E8D7D6E9D7D8EEDCDCF1E0DFF1DFDFF0DEDEF3E2E1F4E3
+ E2F0E0E0EADADAE6D6D6ECDDDDEADCDBEDDDDDF3E4E4F0E2E2FFF0EF79717000
+ 0000746C6BF4E1DFE8D6D5E2D0CEE8D5D4DDCBCADECFCEF2E0E0E3D3D2E0CFCE
+ EEDCDCEBD9D9E6D5D4EAD8D7EEDBDAF0DCDBE5CFCDEFD9D7EBD5D4E8D3D2D9C5
+ C4DCC7C6F2DCDCE9D4D3ECD6D5E8D2D1E6CFCEE9D4D2DCC7C6DEC8C7E6D0CFE7
+ D0D0E7D1CFE5CECDE6CFCEDBC4C3DFC8C7EFD7D6E5CBCAECD4D2ECD5D4E8D2D0
+ EBD3D2E9D0D0E7CECEE6CCCBEAD1D0DDC3C2E8CDCCE9CECDE6CACAE9CCCCE8CA
+ C9EACDCBD9BDBBE7CAC9E9C9C7E2C2C0EECDCBF1CFCEEBC8C6E5C2C0EFCAC8E7
+ C2C0E9C4C2E9C5C3E5C1BFE9C4C2EBC4C2DEB7B5E7C2C0ECC7C5E9C3C1EAC2C0
+ E6BFBDEDC5C3E9BFBCEDC2BFE9BCB9E9BDBAE9BEBBEEBEBBE8B9B6E5B6B3EDC1
+ BFF0C0BDEABBB8EBBDBAF0C2BFEAC2BFEAC0BDEBBFBDECBFBCE8BFBCEBC0BDEC
+ C1BEEEC3C1EBC0BDEABDBBEBC2C0EFC5C2EDC3C1E1B7B5E9C1BEE9C5C2E9C7C5
+ E8C2C0E6BFBDE6C0BFDBB8B6EAC6C4F4CECDF0CAC8F1CCCAE6C3C1F2D0CFEDCC
+ CAEACAC7EBCAC9DCBCBADDBEBDE8CAC9EBD0CFEFD4D3DCC0BFE4CACAEBD2D1E7
+ CECDE9D0CFEBD2D1E7CECDEDD4D3F1D8D6ECD2D1E6CBCAEDD4D2DFC5C5E2C9C8
+ D9C1C0DBC3C1EED6D5E7D0CFDDC5C4ECD5D4E7D1D0E3CFCDE5D2D1D5C2C1E2CE
+ CDE8D3D2E7D3D2E5D0D0E0CCCCE5D1D1E2CFCFD8C7C7DFCECEF0DFDFF2E1E0ED
+ DCDBE5D4D4E7D6D5F0DFDEEBDAD9E8D8D7EEDEDEECDBDBE2D3D2E4D4D4E2D3D3
+ EDDEDEE8D9D9ECDEDDF9EAEA736B6B000000746B6AE4D1CFE3D1D0D2C1C0E4D1
+ D1E0CECDDECFCEE2D2D1DECECDDBCACAE2D0D0DBC9C8DDCBCAD7C4C3E3CFCED8
+ C4C3E0CBCADDC9C8E9D5D4D9C5C4D5C1C0E4D0CEF3DEDCE5D0CFD6C0C0E4CECD
+ D9C3C2E0CAC9DFCAC9DDC7C6E2CCCBD7C0C0E2CCCBD8C1C1E2CCCBDCC6C4E3CC
+ CBEFD9D7D4BCBADFC7C6EDD6D5E7D0CFE1C8C8DCC4C3DFC6C6DDC5C4E7CFCEDD
+ C3C2E7CCCBE1C5C4E1C6C5E3C8C6DFC4C3EED3D2DCBFBEE9CAC8E4C4C2DABBB9
+ EACAC9F0CFCDEDCAC9DBB8B6ECC7C6E3BFBDE1BEBCE1BFBDE3C0BDE8C2C0EAC5
+ C3DFBAB8E7C3C1E2BEBCE2BBB9E1BAB8E1BBB8E9C0BEECC3C0EBC1BEE1B5B2E6
+ BDBAE3B7B5EABCB9E4B6B3E4B8B5E5BBB9E8B9B7E2B5B2E9BDBAEBBEBBE4BDBA
+ E6BCBAE9C0BDE6BAB7E5BCBAE5BBB8E4BAB7EBC1BFE3BAB7E4B7B5EAC2BFEDC5
+ C3EDC4C1E0B8B5E5BDBBE3BDBBE2C0BEE4C2BFDEB9B7ECC6C4DEBAB7EBC7C5F2
+ CFCDF0CCCAE2BDBCDBB7B5F0CECCE1C0BEE8CAC8E0C2C0E0C1C0E8C9C8EACBCA
+ E9CCCBEBCFCEDAC0BFE7CDCCE4CACADEC5C4E7CECEE9D1D0D9C1C0DFC6C6F1D9
+ D8E5CCCBD8BFBEEFD6D5DBC2C1E3CAC9E0C7C6E0C8C7EAD2D0DEC6C5DEC6C5E3
+ CBCAE5CDCCD8C1C0EAD5D5D9C5C4EAD6D5EDDAD9E3CFCFD6C3C1DECBCAE3D0CF
+ DECCCCDAC9C9E3D3D3EEDDDDE3D2D3DACAC9E3D2D2DAC9C9E2D2D1DCCCCBE1D1
+ D0DFCFCFE0D0D0DDCDCDDDCDCDD7C8C8EEDFDED8C9C9E8D9D9EADAD96E666500
+ 0000766D6CE6D2D1F5E3E1DCCBC9EBD8D7E4D2D1E1CFCEDFCECDEAD8D7E2D0D0
+ DDCCCADBC9C8EFDCDBD9C6C5E2CFCED5C1C1E9D5D4DECAC9D2BEBDE1CDCCECD9
+ D7E2CECDF0DBDAE4CECDD1BCBBE5CFCEDCC6C5DEC8C7DEC9C9DFCBCBE5D0CFD9
+ C3C3EBD6D5DDC7C6EBD5D4E0CAC9E3CECDE8D2D1D9C1C0DDC5C3ECD4D3EDD5D5
+ DFC8C7E2CBC9EBD3D2DEC5C4E8CFCEDDC3C2E6CBCAE0C6C5E3C8C7E7CDCBE1C8
+ C7EED2D1DEC0BFECCDCBE0C2C0DDBDBCE6C7C5EDCDCBEBC9C7E1BEBCE3C0BFE1
+ C0BEE8C6C4E2BFBEE6C3C1E8C4C2E2BEBCE5C1C0E4C2BFE2BDBBEAC3C1EBC5C2
+ E5BFBCE4BCBAEDC4C2EBC1BFE1B7B4ECC4C1E2B8B5E4B8B5E6BAB7E9BEBCE1B8
+ B5E4B7B4E3B7B4EBBFBDE8BDBAE2BCB9E6BDBAE7BEBCE2B6B4E9C1BEE6BDBBE8
+ C0BEEBC2BFE1BAB7E3B8B6E7BEBBF1CBC8F0C8C6DFB9B6ECC4C2E9C2C0E6C2C0
+ EAC8C7E1BDBCEBC6C3DCB7B5E8C5C3EFCDCBEECCCBDFBCBADFBCBAE5C4C3E1C1
+ C0DEC1C0E6C9C8EBCFCEE4C8C6E5C7C6E8CAC9DFC2C1E1C7C6DFC6C5E5CCCBE0
+ C7C6EED6D6E6CFCEE0C8C7E1C9C9ECD5D4E0C9C8DFC7C6E4CCCCDEC6C5E6CECC
+ E1C8C7E0C7C6E4CCCBE3CBC9EDD5D4DBC3C2EDD6D5DEC6C6EED8D6D8C4C2E7D3
+ D1EFDBDAECD9D8DBC8C6E8D5D5E0D0D0DACACAE7D6D6E8D8D8E9D8D8DCCCCCD7
+ C7C7ECDBDBDECECEDDCDCEE1D1D1E9DADAD9C9C9D8C8C8E3D4D3E0D1D1D7C8C8
+ E5D6D5D9CACAEEDFDFE8D8D7746C6B000000726969E3CFCEE7D4D3D6C4C3DECC
+ CBDBC9C8E1D0D0E0CFCEDAC9C8D6C4C4DACAC8DCCBCADECCCCDAC9C9E5D3D2D5
+ C1C0E7D4D3DBC7C6E9D4D4E8D4D3DEC9C9D6C1C0F0DBDAF0DADADBC6C5DFCACA
+ DBC7C6E2CDCDDCC8C8E2CECEE5D1D1D7C3C2E4D0D0D9C5C5E2CECCDAC6C6E4CF
+ CEDCC6C4E2CAC9DCC3C2E0C8C7EED7D6E5CFCEDEC6C5E2C9C9DFC6C5E7CECDDD
+ C3C3E6CDCCDEC5C4E2C9C8E4CBCADEC3C2E4C7C6E1C3C2E6C8C6DCBEBDE5C7C5
+ E2C3C1EDCCCBEAC8C6E5C4C3DDBBBAE4C3C2EBCAC7E0BDBBE0BDBBE2BEBCDFBB
+ BAEAC8C5E0BDBBE3BEBCE6C0BEEAC6C3E0BAB8E6BFBDECC4C1EAC1BFE2BAB8E6
+ C0BEE2B8B6E9BFBCE5BAB7E3BBB8E6BEBBE5B9B6E2B8B5EFC5C3EEC3C0E4BEBB
+ E2BBB9E3BCB9E3B9B6E3BBB9E1B9B8E6BFBCE4BCBAE5BEBCE5BDBBE2B8B6ECC7
+ C4E8C2C0DDB7B5E7C0BEE4BDBBE3BFBCE4C2C1DCBBB9E1BEBCDDBAB8ECC9C7EB
+ CAC8ECCBC9DEBEBBDDBCBBE1C0BFE0C0BFE5C7C6E3C7C6E0C4C4E1C6C4EBCFCE
+ E7CAC9DBBFBDE9CCCBDDC3C2DDC3C2DEC5C4E0C8C8DCC5C4E5CDCCE4CDCCDEC7
+ C6DEC7C6E5CDCDDEC7C6DDC6C5E2CAC9DCC5C3E7CECDE5CDCCDFC7C6E5CECCD8
+ C1C0E7D0CFDAC3C2E0CAC9D7C1C0EBD5D4EBD6D6E5D1D1D9C6C6DDCCCBE3D3D3
+ E1D2D1E2D3D3E9DADAF0E0E0DECFCEDAC9CAE6D5D5D9CAC9E7D6D6DECFCEE0D1
+ D2E1D3D2DFD0D0DCCDCCDBCCCCDFD0D0E3D4D4D4C5C6E6D7D7EBDADA69616100
+ 00007B7272F9E6E5EFDEDDECDBDAE9D9D8EDDDDDECDCDBECDBDBE6D5D5DFCFCE
+ E8D7D6EDDCDBE5D3D3E7D6D5EDDADAEAD6D5ECD8D7E5D1D0EAD6D5E7D3D2E6D1
+ D1EBD6D6EEDAD9EAD6D5E7D3D2E7D2D1E7D3D2EBD6D6E1CDCCE3CFCEE6D3D3E5
+ D1D1E9D4D4E4D1D0EBD7D6E5D1D0E9D4D3E8D1D1F1DAD8F2DAD9EDD6D5F1DBD9
+ F0DAD9E9D2D1E6CECDEBD2D1EBD1D1EAD1D0E8CFCDE8CFCEE8CFCEEAD0CEE7CC
+ CAE7CAC9EACDCBEBCDCCE4C6C4E7C8C7EDCECBEDCDCBEAC9C8EACAC9DFBFBDE6
+ C7C5EACAC7E8C5C3E8C5C3E7C4C3E8C6C4ECCBC8ECC9C7ECC7C5EBC7C5ECC8C6
+ EBC6C4ECC6C3EBC4C2EAC2C0EAC3C1E8C2BFEBC2BFECC3C1EAC0BEEAC3C1EBC4
+ C1EFC3C2EBC2C0EBC2BFECC2C0EBC6C4EAC3C1ECC6C3EDC4C2EAC2C0EBC5C2EF
+ C9C6EAC4C1EFC8C6EFCAC7ECC4C2EEC7C5F1CCCAEBC5C4EBC5C3EBC5C3EFCBC9
+ F0CCCBEDCDCCE7C7C5E6C5C3ECCBC9E7C6C5ECCDCBEACCCAEACBCAEACAC9ECCD
+ CCEFD0CFEDCFCEE7CCCBEED3D2EFD4D3EACFCFE9CECEECD0CFEFD3D3ECD3D2EA
+ D2D1EFD7D6E9D2D1ECD4D4EFD8D6EED7D6EED6D6EED7D6ECD5D4EFD8D7EFD8D8
+ EAD3D3F1D9D8E4CDCCE1CAC9F1DAD9DBC4C3F3DCDBEFD9D7E8D2D1EAD5D4EDD8
+ D7ECD7D6EEDADAEBD7D6E5D4D3ECDCDCDED0D0DFD1D1E5D7D7EDDEDEE3D4D4EB
+ DBDBE9D9DAE9D8D8EEDDDDE6D6D6EDDFDFEADCDBEADCDCEADCDBECDDDDECDDDC
+ F0E1E1E6D9D8EBDDDCFBEDEC746C6C0000007A7271F5E4E3EAD9D8E8D8D7E7D8
+ D7EFDFDFF0E0E0EEDEDDEFDFDFE1D0CFE7D6D5EADBD9F0DFDEEBDAD9EDDBDAED
+ D9D8E7D4D3E8D4D3E2CECDE8D4D3EFDAD9ECD6D5E9D5D5E9D6D5E7D3D3E7D3D2
+ EAD6D5ECD8D7ECD8D7EBD7D6EDDAD9EBD9D8EDDADAE8D5D5E9D5D5E9D4D3EDD8
+ D7EBD5D4EED9D7F1DBDAEDD6D6E8D2D0EFD8D7EFD7D6EBD4D3EED6D5EBD1D0EE
+ D5D5E8D0CEEBD2D1EED4D3EBD0D0E7CBCAE7CCCAEACECDF2D4D3F0D2D0ECCDCB
+ F0D0CEF0D0CEEBCBC9E1C1C0E1C2C0EBCBC9ECCAC8EBC9C8F1CFCDEBC9C8EBCB
+ C9ECCBC9EBC8C6EAC7C5ECCAC7EDC9C7ECC8C6EDC7C5EFC9C8EDC5C4EDC9C7EF
+ C8C6EEC6C4EDC4C2EAC2C0EBC5C3E6C1BEECC3C1E9C2C0EBC3C1ECC4C2E9C6C3
+ EBC6C4EEC8C5ECC5C4EAC3C1E9C5C2EEC8C5E9C4C2EDC7C5EDC8C5ECC5C3E8C1
+ BFE9C5C3E9C5C2E6C1BFE9C4C2EECAC8EECBC9EECFCDEBCDCBE9C9C8EBCBCAE5
+ C5C4E9CAC9E3C5C4EACCCBEBCDCCECCECCEBCDCBECCECDE8CCCBEAD0CFEED4D3
+ ECD1D1EED3D3EFD4D4F0D5D4EED3D3EDD4D4ECD5D4EED7D6E7CFCEE9D2D1F1DA
+ D9ECD5D4EBD3D3E7D0CFE9D3D2EED9D9EAD6D5EBD5D5EBD6D5DAC5C4DBC6C5E0
+ CACAF1DCDBF0DBDCEBD7D7EDDADAF1DDDCEDD9D8F0DCDBF2DEDDE7D5D5E8D7D7
+ DACBCCE0D1D0E3D4D4EDE0E0E8D9DAEBDDDDE9DADAEBDBDBE5D5D5DFD0D0DED0
+ CFE0D1D1E5D5D5E3D4D4ECDEDDEADBDBECDEDDF2E3E3F2E4E4FFF5F47A727200
+ 000078706FF7E6E5EBDADAEBDBDBEBDCDCE9DADAEDDDDDEEDFDEEDDDDDE0CFCF
+ E1D1D0E8D7D6E8D7D6E9D7D7EDDAD9F0DDDCEEDBD9F1DEDDEFDBDAE9D5D4E8D3
+ D3E9D5D4EFDBDAEDDAD9EAD7D6E6D3D3ECD9D8ECD8D8EFDCDBECD8D8EBD9D7EA
+ D7D6EEDADAECD8D8EBD6D6E9D4D4ECD7D6E8D2D2EDD8D7EBD5D5ECD4D5E7D0CF
+ EED6D5F0D9D7ECD4D4EBD3D2E7CFCEEBD4D2E6CDCCE7CDCCEED3D2EDD1D0EACF
+ CEEBD0CFECD0CFEACDCBECCDCCEECFCDEDCFCDECCDCCEECFCDECCDCBECCDCCEC
+ CDCCECCBC9EBCBC9F0CFCDE7C7C5E9C8C6ECCBC9E8C5C4E8C6C4EDCAC8EDCAC8
+ EBC7C4E6C1BFEEC8C7ECC6C5EBC8C6E8C1BFEAC2C1EFC7C6EEC7C4EFCBC9EDC8
+ C6F0C8C6ECC6C3ECC6C3EBC4C1EBC8C5EAC6C3EEC8C7EDC7C5EDC5C3EECAC8EE
+ C9C7EAC6C3EEC9C7F0CBCAF2CDCBF2CCCAEAC6C5EBC9C7EBC8C7EAC6C5EAC8C6
+ EBCAC9ECCCCAECCFCDECCECDEDCDCDEACBC9ECCDCBE7C9C7E6C9C8E4C8C6E5C8
+ C7EBCDCCF0D2D1E8CCCAE5CAC9EBD0D0E9D0CFECD3D2EDD4D3EAD0D0EBD1D1ED
+ D4D4E9D1D1EBD4D3E5CFCEE9D2D2F0D9D8F0DAD9F1DBDBEBD6D5E8D4D3E9D5D5
+ E7D3D3E6D2D1F0DCDBE9D4D3E5D2D1E6D3D2ECD9D8ECD9D8E5D1D1E3CFCFE9D5
+ D4EAD6D6EEDBDBF3E0DFEDDADAEBDAD9E9D9D9E4D4D4E6D7D7EADCDDE8D9DAEA
+ DCDCE5D7D7EBDCDBECDCDCE9DBDBE7D9D8ECDDDDEEDDDDEDDDDDEAD9D9E1D1D1
+ E3D4D4E9D9D8E9DAD9FFF4F37B7272000000787070E8D7D7E5D3D4E9DAD9EDDF
+ DEEDDEDEEFE0DFF0E0DFDBCBCADECECEECDBDBF3E3E2DFCECDDFCCCBEFDBDAF1
+ DEDDF7E3E2F6E2E1F2DEDDF2DEDCDECAC9DBC7C6E0CDCCEFDCDCF0DDDCEAD7D6
+ F1DEDEEEDBDAEEDCDBECD9D9EFDBDAEEDAD9F0DBDAF1DBDBEFD9D9EEDAD9F1DC
+ DBEBD6D5EFD8D8EDD6D6EDD6D5E8D0D0EED7D6EFD7D6F1D9D8EFD9D7EED7D6F1
+ D9D7EFD5D4EDD3D1F3D8D7EFD4D3E9CFCDECD1CFF1D5D3F0D3D1EED0CFEED0CE
+ F1D3D1ECCFCDEDD0CEF0D2D0F0D2D0EFD0CEE3C3C1E8C9C6F5D5D3EACBC9EBCB
+ C9F4D3D0EECCCAE9C7C5EDCBC9EFCCCAF0CCCAE8C4C2ECC7C5ECC8C6EDCBC9E9
+ C3C1E8C3C1EEC8C6EBC6C3EECAC9EBC7C5F0C8C6EDC7C5EEC9C7ECC5C3EBC8C7
+ E9C5C3EDC8C6F0CCCAEFC9C7EFCCCAF2CECCEDC9C7F0CCCAF3D0CDF4D1CFF5D1
+ CFF4D0CEEDCBCAEFCECCEDCCCBE6C5C4EBCAC8ECCBCAEBCDCCEDD1D0ECCFCDEA
+ CCCAECCDCCEED0CFEED1D0EED3D1E9CDCCE7CAC9ECCECDEACDCCDFC3C2E4CAC9
+ EDD4D3EFD7D6F1DAD8EAD1D0ECD2D2EED5D4EBD2D1F0D7D7E9D1D0EAD3D2EED8
+ D8E8D2D1ECD6D6DFCAC9EAD6D6EDD9D9EEDADAE9D5D5EFDBDAF0DCDBF0DCDCDF
+ CACAE3CFCFF2DFDEECD8D8EAD7D6EFDCDBEBD7D7EEDADAF0DDDCF3DFDFEEDCDC
+ F0DEDEEBDADAE9D9D9EADBDBE8D8D8F0DFDFE8D8D8EADADAEADCDCEEE0DFE9DA
+ DAEADADAE9D8D7ECDBDAF4E4E3EDDDDCEDDDDDF0E0E0E7D8D6FFF6F4736A6A00
+ 0000797071E8D6D6E1D0D0E5D6D5DDCFCEDDCFCFE0D1D1EADAD9D8C7C7DACACA
+ E1D1CFE6D5D5DECDCDD8C6C5DBC8C7DBC7C6E5D2D1DFCBCADAC7C6ECD9D8EDD9
+ D8E2CECED3C0C0E7D5D4F0DDDDEBD8D7DFCCCBE0CDCCDDCAC9E1CDCDDECAC9DB
+ C7C6E5D0D0F1DCDCE0CCCBE3CECDEBD6D5E0CBCAE3CDCDEFD8D7E7D0CFDBC4C3
+ DFC8C7E9D3D1EFD9D8E9D3D2EAD3D2EFD5D4E8CECCE3C8C7EACFCEF1D7D6E2C7
+ C6E5C9C7F1D4D2E8CAC9E0C3C1E4C7C5EDD1CFE8CCCAE3C6C4E9CBC9E4C6C4EC
+ CDCBE4C4C2E2C2C1EACBC9EECFCDE8C8C6E5C4C2E5C4C2EDCDCBEDCCCAE1BEBC
+ F2CECCF0CCCAF0CCCAE7C6C4E5C3C1E6C1BFE6C1BFE4BFBDE7C3C1E1BEBDE3BE
+ BCF0C9C7E6C1BFE5C1BFE7C2C0E5C3C0EFCDCAE2BEBBECC9C7EEC9C8E0BDBCEA
+ C7C5EDCAC8E5C2C0E8C5C3F2D0CEE8C4C3EDC9C7EECECDE4C3C2F1D0CFEDCDCC
+ E9C9C7E0C0BEE2C2C1E7CAC9E2C7C5E7CAC9E1C3C2E3C6C5E3C6C6EACFCEE0C5
+ C4EDD1D0EFD3D1EFD3D2DFC3C2E3C8C7E7CCCCE1C8C7E5CDCCEDD5D3E9CFCEE1
+ C8C7E7CFCDF1D8D7E0C8C8E9D2D1E7D0CFDFC9C8E9D4D3DAC6C7E8D4D4E5D1D2
+ DECBCAE3CFCFE9D4D4DCC8C7E6D1D1DCC9C8E1CECCF2DEDDE1CCCCEAD5D4F0DB
+ DBDECAC9DECAC9DCCAC8E5D1D1DECBCAE9D6D5F1DFDFEFDEDEEFDDDDEDDDDDE8
+ D7D7E4D2D2E4D4D4E1D2D2DFD0CFE1D2D1EADBDAE1D2D1E5D5D4E1D1D1E7D8D7
+ E0CFCFE4D4D4E7D7D7F5E8E7746B6B0000007E7575F7E5E3F8E7E6F3E2E2E6D6
+ D5F8E7E8E6D5D5FEEDEDEAD9D8F5E3E2ECDAD8EFDDDDF2DFDFEEDAD9F9E4E3E8
+ D3D2EAD5D4F1DCDBEDD8D7E8D4D2E7D2D1EED8D7FAE6E5FBE7E7F8E4E4E9D6D5
+ ECD7D7F3DFDEEDD9D8F7E2E2E9D3D3F2DDDBE9D3D3FDE9E7E8D3D2F5DFDEEDD6
+ D5F7E0DFEFD7D6F5DDDCEFD6D6F5DDDDEDD5D5F2DBD9FFEDEBFFEAE9FFE6E4FC
+ DFDEE7CBCAFADFDDEDD1CFF2D4D3ECCFCDF9DAD9FFE0DEECCDCCF6D8D6EED0CE
+ FBDEDCF4D6D5F1D2D1F2D1D0F1D0CEFFDEDCF2D1CFF2D2D0EFCFCCEFCECCEBCA
+ C7FAD7D5EFCBCAF6D2D1F9D5D3E6C1BFFCD7D5FFDCDAFBD5D3F0CDCBF5CFCDFA
+ D3D2F1CAC8F3CBC9F5CECDF4D0CEF2CCCAF8CFCDF1CBC9FAD3D1F8D1CEF0CCCA
+ FDD9D8F1CBC9FAD6D3F3CCCAFBD7D5F3CFCEFDD8D6EFCBCAF7D2D1FFDDDAEECA
+ C7FCD7D5F8D4D3E9C7C5FDDAD9FFDDDCFEDDDBF1CFCDF3D2D1F4D5D4F9DBDAF1
+ D4D3F6D7D7F0D1CFF5D6D5F6D7D6F1D3D2FFE5E4FEE2E1FDE0DFEBCDCCF1D4D4
+ F4D8D7F1D5D4FEE2E1FADFDEEED3D1E6CCCBF6DCDBF4DAD9E6CCCBF1D8D7F3DA
+ D9ECD4D3FDE6E6ECD6D7F8E4E3ECD8D7F0DBDAEDD8D7FBE6E6E8D2D2FAE5E4F0
+ DBD9F5DFDFFCE6E5E2CDCCF6E0DFF4DEDDEDD8D7F2DDDCE8D3D2F5E2E1E4CFCE
+ F7E2E2FBE7E7FEEAE9FFECEBF5E1E0E3CFCEFAE5E5E7D5D4F9E7E6ECDADAF8E7
+ E6F0E0DFEBDBDAEFDEDDEEDEDEFEEDECEEDEDDEBDADAEBD9D8FFF5F5837A7A00
+ 00003B3737756D6C787070776F6E6D6565756E6D6D65657870706F6666746B6B
+ 7168687169697168686E65647268686B61616A6160766C6B736969685E5D6F65
+ 657C72717D73737B72727970706D6564716867736969716767756B6A6E646472
+ 69686C6262766C6C6D6363756B6B6E6363786E6D7267677065656E6463726767
+ 6F65656E6463766A6A786C6C776A697669686C5F5E766A697163637467667162
+ 627667677A6B6A6E605F7869697062617467667365647365647466656E5F5E79
+ 69687363637667667566656E5F5E6F5F5E7B6C6A74636372616171605F6C5B5A
+ 715F5E78666575646374636272615F7A68677362607462617361617867667462
+ 627462617463617564627A686774636273636274626175656372615F7A696874
+ 64637867667262617665647A696870605F76656470605F6E5F5E736463796968
+ 7767677363626E5F5E7364637668676F61617769687263637466657365647264
+ 647A6C6C776B6A7366666D605F6E6160746665716363786B6A776B6A6E62616E
+ 6262766A697064646D61606E61607165657065647469686E64647369696E6464
+ 736969706666746A6A6F6565776D6D706666736968746A6A6F6565756B6A7168
+ 67736969766C6C6F6565736A696B6261776D6D776E6D746B6A766D6C72696869
+ 5F5E7065656B6160746B6B6D6565776E6E6F6867726A6A746C6C6D65657A7272
+ 736B6B6961616C6464817B7B3D3939000000}
+ ShowHint = True
+ Transparent = True
+ OnClick = Image1Click
+ end
+ object MediaPlayer1: TMediaPlayer
+ Left = 88
+ Top = 1
+ Width = 253
+ Height = 30
+ Display = Panel1
+ FileName = 'C:\WINNT\winnt256.bmp'
+ Visible = False
+ TabOrder = 0
+ end
+ end
+ object pnlAvailable: TPanel
+ Left = 0
+ Top = 81
+ Width = 281
+ Height = 326
+ Align = alLeft
+ BevelOuter = bvNone
+ TabOrder = 1
+ object Panel2: TPanel
+ Left = 0
+ Top = 296
+ Width = 281
+ Height = 30
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton4: TSpeedButton
+ Left = 200
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = 'I&nstall'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 33333333FF33333333FF333993333333300033377F3333333777333993333333
+ 300033F77FFF3333377739999993333333333777777F3333333F399999933333
+ 33003777777333333377333993333333330033377F3333333377333993333333
+ 3333333773333333333F333333333333330033333333F33333773333333C3333
+ 330033333337FF3333773333333CC333333333FFFFF77FFF3FF33CCCCCCCCCC3
+ 993337777777777F77F33CCCCCCCCCC3993337777777777377333333333CC333
+ 333333333337733333FF3333333C333330003333333733333777333333333333
+ 3000333333333333377733333333333333333333333333333333}
+ NumGlyphs = 2
+ OnClick = Button2Click
+ end
+ object SpeedButton5: TSpeedButton
+ Left = 4
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = '&Info'
+ Flat = True
+ OnClick = SpeedButton5Click
+ end
+ object SpeedButton6: TSpeedButton
+ Left = 69
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = '&Select'
+ Flat = True
+ OnClick = Button5Click
+ end
+ object SpeedButton7: TSpeedButton
+ Left = 135
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = 'Select &All'
+ Flat = True
+ OnClick = Button6Click
+ end
+ end
+ object PageControl1: TPageControl
+ Left = 0
+ Top = 24
+ Width = 281
+ Height = 272
+ ActivePage = TabSheet1
+ Align = alClient
+ MultiLine = True
+ TabOrder = 1
+ object TabSheet1: TTabSheet
+ Caption = 'Local'
+ object localTree: TTreeView
+ Left = 0
+ Top = 0
+ Width = 273
+ Height = 244
+ Align = alClient
+ Images = ImageList1
+ Indent = 19
+ ReadOnly = True
+ StateImages = ImageList2
+ TabOrder = 0
+ OnDblClick = localTreeDblClick
+ end
+ end
+ end
+ object Panel8: TPanel
+ Left = 0
+ Top = 0
+ Width = 281
+ Height = 24
+ Align = alTop
+ Alignment = taLeftJustify
+ BevelOuter = bvNone
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentFont = False
+ TabOrder = 2
+ object Label1: TLabel
+ Left = 0
+ Top = 0
+ Width = 53
+ Height = 24
+ Align = alLeft
+ BiDiMode = bdLeftToRight
+ Caption = 'Available'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentBiDiMode = False
+ ParentFont = False
+ Layout = tlCenter
+ end
+ object Panel3: TPanel
+ Left = 53
+ Top = 0
+ Width = 228
+ Height = 24
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton2: TSpeedButton
+ Left = 180
+ Top = 0
+ Width = 23
+ Height = 22
+ Enabled = False
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 333333333333333FF3FF3333333333CC30003333333333773777333333333C33
+ 3000333FF33337F33777339933333C3333333377F33337F3333F339933333C33
+ 33003377333337F33377333333333C333300333F333337F33377339333333C33
+ 3333337FF3333733333F33993333C33333003377FF33733333773339933C3333
+ 330033377FF73F33337733339933C33333333FF377F373F3333F993399333C33
+ 330077F377F337F33377993399333C33330077FF773337F33377399993333C33
+ 33333777733337F333FF333333333C33300033333333373FF7773333333333CC
+ 3000333333333377377733333333333333333333333333333333}
+ NumGlyphs = 2
+ Visible = False
+ end
+ object Image2: TImage
+ Left = 72
+ Top = 8
+ Width = 14
+ Height = 16
+ Picture.Data = {
+ 07544269746D617076010000424D760100000000000076000000280000002000
+ 0000100000000100040000000000000100000000000000000000100000001000
+ 0000000000000000800000800000008080008000000080008000808000007F7F
+ 7F00BFBFBF000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
+ FF0033333333333333333FF3333333333333447333333333333377FFF3333333
+ 3333744473333333333337773FF3333333333444447333333333373F773FF333
+ 333333444444733333333373F3773FF3333333744444447333333337F333773F
+ F333333444444444733333373F3333773FF333334444444444733FFF7FFFFFFF
+ 77FF999999999999999977777777777733773333CCCCCCCCCC3333337333333F
+ 7733333CCCCCCCCC33333337F3333F773333333CCCCCCC3333333337333F7733
+ 333333CCCCCC3333333333733F77333333333CCCCC333333333337FF77333333
+ 33333CCC3333333333333777333333333333CC33333333333333773333333333
+ 3333}
+ Transparent = True
+ end
+ object Label2: TLabel
+ Left = 92
+ Top = 8
+ Width = 87
+ Height = 13
+ Caption = 'Selected for Install'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object SpeedButton1: TSpeedButton
+ Left = 8
+ Top = 0
+ Width = 23
+ Height = 22
+ Hint = 'Manage Remote Sources'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00555555555555
+ 5555555555FFFFF555555555544C4C5555555555F777775FF5555554C444C444
+ 5555555775FF55775F55554C4334444445555575577F55557FF554C4C334C4C4
+ 335557F5577FF55577F554CCC3334444335557555777F555775FCCCCC333CCC4
+ C4457F55F777F555557F4CC33333CCC444C57F577777F5F5557FC4333333C3C4
+ CCC57F777777F7FF557F4CC33333333C4C457F577777777F557FCCC33CC4333C
+ C4C575F7755F777FF5755CCCCC3333334C5557F5FF777777F7F554C333333333
+ CC55575777777777F755553333CC3C33C555557777557577755555533CC4C4CC
+ 5555555775FFFF77555555555C4CCC5555555555577777555555}
+ NumGlyphs = 2
+ ParentShowHint = False
+ ShowHint = True
+ OnClick = SpeedButton1Click
+ end
+ end
+ end
+ end
+ object pnlInstalled: TPanel
+ Left = 284
+ Top = 81
+ Width = 305
+ Height = 326
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 2
+ object Panel5: TPanel
+ Left = 0
+ Top = 296
+ Width = 305
+ Height = 30
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton3: TSpeedButton
+ Left = 8
+ Top = 3
+ Width = 77
+ Height = 25
+ Caption = '&Remove'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 333333333333333333FF33333333333330003333333333333777333333333333
+ 300033FFFFFF3333377739999993333333333777777F3333333F399999933333
+ 3300377777733333337733333333333333003333333333333377333333333333
+ 3333333333333333333F333333333333330033333F33333333773333C3333333
+ 330033337F3333333377333CC3333333333333F77FFFFFFF3FF33CCCCCCCCCC3
+ 993337777777777F77F33CCCCCCCCCC399333777777777737733333CC3333333
+ 333333377F33333333FF3333C333333330003333733333333777333333333333
+ 3000333333333333377733333333333333333333333333333333}
+ NumGlyphs = 2
+ OnClick = Button4Click
+ end
+ end
+ object Panel7: TPanel
+ Left = 0
+ Top = 0
+ Width = 305
+ Height = 24
+ Align = alTop
+ Alignment = taLeftJustify
+ BevelOuter = bvNone
+ Caption = 'Installed'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentFont = False
+ TabOrder = 1
+ end
+ object Panel6: TPanel
+ Left = 0
+ Top = 24
+ Width = 305
+ Height = 272
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 2
+ object installTree: TTreeView
+ Left = 0
+ Top = 0
+ Width = 305
+ Height = 272
+ Align = alClient
+ Indent = 19
+ ParentShowHint = False
+ ReadOnly = True
+ ShowHint = False
+ TabOrder = 0
+ end
+ end
+ end
+ object statusBar: TPanel
+ Left = 0
+ Top = 407
+ Width = 589
+ Height = 22
+ Align = alBottom
+ Alignment = taLeftJustify
+ BevelOuter = bvLowered
+ TabOrder = 3
+ object Panel4: TPanel
+ Left = 436
+ Top = 1
+ Width = 152
+ Height = 20
+ Align = alRight
+ Caption = 'Panel4'
+ TabOrder = 0
+ object progressBar: TProgressBar
+ Left = 1
+ Top = 1
+ Width = 150
+ Height = 18
+ Align = alRight
+ BorderWidth = 2
+ Min = 0
+ Max = 100
+ TabOrder = 0
+ end
+ end
+ end
+ object MainMenu1: TMainMenu
+ Left = 748
+ Top = 4
+ object File1: TMenuItem
+ Caption = '&File'
+ object Exit1: TMenuItem
+ Caption = 'E&xit'
+ OnClick = Exit1Click
+ end
+ end
+ object Option1: TMenuItem
+ Caption = '&Options'
+ object LocalPath1: TMenuItem
+ Caption = '&Local Path...'
+ OnClick = LocalPath1Click
+ end
+ object ManageRemoteSources1: TMenuItem
+ Caption = '&Manage Remote Sources...'
+ OnClick = SpeedButton1Click
+ end
+ end
+ object View1: TMenuItem
+ Caption = '&View'
+ object LockedModules1: TMenuItem
+ Caption = '&Locked Modules'
+ OnClick = LockedModules1Click
+ end
+ end
+ object Help1: TMenuItem
+ Caption = '&Help'
+ object Contents1: TMenuItem
+ Caption = '&Contents'
+ OnClick = Contents1Click
+ end
+ end
+ end
+ object localPathDlg: TOpenDialog
+ Options = [ofNoChangeDir, ofEnableSizing]
+ Left = 716
+ Top = 4
+ end
+ object Timer1: TTimer
+ Left = 524
+ Top = 78
+ end
+ object ImageList1: TImageList
+ Left = 524
+ Top = 110
+ Bitmap = {
+ 494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000003000000001002000000000000030
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF0000FFFF00FFFFFF0000000000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF0000FFFF000000000000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000808080008080
+ 80008080800080808000808080000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 0000000000000000000080808000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF
+ 0000FFFF0000FFFF0000FFFF00000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF00000000
+ 00000000000080808000000000000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF0000FFFF
+ 0000FFFF0000FFFF000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000FF000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FF00000000000000FF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000BFBFBF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000C0C0C0000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000FF00000000000000FFFFFF0000000000FF00000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000000000000000000000000000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000000000000000000000000000FFFF00000000000000
+ 000000FFFF00000000000000000000000000000000000000000000000000FF00
+ 000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF000000000000FFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF000000000000FFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000FF000000FF00
+ 0000FF00000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF0000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000FFFFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000FFFFFF000000000000FFFF0000FFFF0000FF
+ FF000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF00
+ 000000000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF007F7F7F00FFFFFF000000000000FFFF0000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF
+ FF0000000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF0080808000FFFFFF000000000000FFFF0000FF
+ FF0000FFFF0000000000000000000000000080000000FF000000FF000000FF00
+ 0000FF000000FF000000FF00000000000000FFFFFF00FFFFFF00FFFFFF000000
+ 0000FF000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000000000FFFFFF0000FFFF007F7F7F0000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000008080800000FFFF00FFFFFF000000000000FF
+ FF0000FFFF00000000000000000000000000FF00000080000000FF000000FF00
+ 0000FF000000FF000000FF000000FF00000000000000FFFFFF00FFFFFF00FFFF
+ FF0000000000FF000000000000000000000000FFFF0000FFFF0000FFFF0000FF
+ FF000000000000FFFF00FFFFFF007F7F7F00FFFFFF0000FFFF000000000000FF
+ FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000FF
+ FF000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF0000FFFF000000000000FF
+ FF0000FFFF0000FFFF0000FFFF000000000000000000FF00000080000000FF00
+ 0000FF00000000000000FF000000FF000000FF00000000000000FFFFFF00FFFF
+ FF00FFFFFF0000000000FF00000000000000000000000000000000FFFF0000FF
+ FF0000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000808080008080
+ 80008080800080808000808080000000000000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000FF0000008000
+ 0000FF000000FF000000FF00000000000000FF000000FF00000000000000FFFF
+ FF0000000000FF0000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF0000FFFF00FFFFFF000000000000FFFF0000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF000000000000FFFF000000000000FFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF000000000000FFFF0000FF
+ FF0000FFFF00000000000000000000000000000000000000000000000000FF00
+ 000080000000FF0000000000000000000000FF000000FF000000FF0000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000000000000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF0000000000FFFFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF
+ 0000FFFF0000FFFF0000FFFF0000000000000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000FF00000080000000FF000000FF000000FF000000FF000000FF000000FF00
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 000000000000FF00000080000000FF000000FF000000FF000000FF0000000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF00000000
+ 000000000000808080000000000000FFFF0000FFFF0000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000FF00000080000000FF00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF0000FFFF
+ 0000FFFF0000FFFF00000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000300000000100010000000000800100000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000E00F000000000000E00F000000000000
+ E00F000000000000F00F000000000000F00F000000000000F80F000000000000
+ F00700000000000080070000000000000007000000000000000F000000000000
+ 001F000000000000001F000000000000001F000000000000811F000000000000
+ 811F000000000000C3BF000000000000FFFFFEFFE00FFEFFFDFFFC7FE00FFC7F
+ F8FFFC7FE00FFC7FF07FD837F00FD837E03FE00FF00FE00FC01FE00FF80FE00F
+ 800FC007F007C0070007C007F007800700030001F00700018001C007F00F0007
+ C003C007F01F0007E00FE00FF81F000FF00FE00FFE1F000FF81FD837FF1F8037
+ FC7FFEFFFF1F80FFFFFFFEFFFFBFC2FF00000000000000000000000000000000
+ 000000000000}
+ end
+ object ImageList2: TImageList
+ Left = 524
+ Top = 142
+ Bitmap = {
+ 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000001000000001002000000000000010
+ 00000000000000000000000000000000000000000000FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F00FFFFFF00FFFF
+ FF00FFFFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000080000000800000007F7F7F000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F0000000000FFFFFF00FFFFFF00000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F0080000000800000008000
+ 00007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F0000000000FFFF
+ FF007F7F7F007F7F7F0000000000FFFFFF00FFFFFF0000000000000000000000
+ 0000000000000000000000000000000000000000000080000000800000008000
+ 000080000000800000007F7F7F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000007F7F7F000000
+ 0000FFFFFF00000000007F7F7F007F7F7F0000000000FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000800000008000
+ 0000800000008000000080000000800000007F7F7F0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00FFFFFF000000000000000000000000007F7F7F007F7F7F0000000000FFFF
+ FF00FFFFFF0000000000000000000000000000000000000000007F7F7F008000
+ 00008000000080000000800000008000000080000000800000007F7F7F000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F0000000000FFFFFF00000000000000000000000000000000007F7F7F007F7F
+ 7F0000000000FFFFFF00FFFFFF00000000000000000000000000000000008000
+ 0000800000008000000080000000800000008000000080000000800000008000
+ 00007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+ FF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF007F7F7F007F7F7F00FFFFFF00FFFFFF000000000000000000000000000000
+ 0000800000008000000080000000800000008000000080000000800000008000
+ 000080000000800000007F7F7F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F007F7F7F007F7F
+ 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F
+ 7F0000000000000000007F7F7F007F7F7F000000FF000000FF000000FF000000
+ FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+ FF000000FF000000FF000000FF000000FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00007F7F7F00000000000000000000000000000000000000000000000000FFFF
+ FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00FFFFFF0000000000000000000000000000000000FFFFFF007F7F7F007F7F
+ 7F0000000000000000000000000000000000000000000000000000000000FF00
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00000000000000000000000000FFFFFF007F7F7F007F7F7F00000000000000
+ 000000000000000000000000000000000000000000000000000000000000FF00
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000007F7F7F000000
+ 000000000000FFFFFF007F7F7F007F7F7F000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FF000000FF00
+ 0000FF000000FF000000FF000000FF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F00FFFFFF00FFFF
+ FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F00000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF000000FF000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000100000000100010000000000800000000000000000000000
+ 000000000000000000000000FFFFFF009FFFFFFF0000000007FF1FFF00000000
+ 89FF07FF00000000A27F81FF00000000D49FC07F00000000E727C01F00000000
+ EBC9E007000000008000F00100000000000C000000000000F7E3F00300000000
+ E78FE00F00000000EE3FE03F00000000D8FFC0FF0000000083FF83FF00000000
+ 8FFF8FFF000000003FFF3FFF0000000000000000000000000000000000000000
+ 000000000000}
+ end
+end
diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.h b/apps/windoze/CBuilder5/InstallMgr/MainFrm.h new file mode 100644 index 0000000..47fe65c --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.h @@ -0,0 +1,146 @@ +//--------------------------------------------------------------------------- +#ifndef MainFrmH +#define MainFrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <Dialogs.hpp> +#include <Menus.hpp> +#include <ExtCtrls.hpp> +#include <MPlayer.hpp> +#include <Graphics.hpp> +#include <ComCtrls.hpp> +#include <swmgr.h> +#include <ImgList.hpp> +#include <Buttons.hpp> +#include <NMFtp.hpp> +#include <NMHttp.hpp> +#include <Psock.hpp> + + +class VersionInfo { + public: + int major, minor, minor2, minor3; + + VersionInfo(const char *version); + int compare(const VersionInfo &vi) const; + bool operator>(const VersionInfo &vi) const {return (compare(vi) > 0);} + bool operator<(const VersionInfo &vi) const {return (compare(vi) < 0);} + bool operator==(const VersionInfo &vi) const {return (compare(vi) == 0);} +}; + + +class InstallSourceTab : public TControl { +public: + __fastcall InstallSourceTab(TComponent *Owner, const char *confEnt, const char *type); + __fastcall ~InstallSourceTab(); + string Type; + string Source; + string Directory; + string Caption; + TTreeView *tree; + SWMgr *mgr; +}; + + +//--------------------------------------------------------------------------- +class TMainForm : public TForm +{ + class TWebThread; + friend class TWebThread; +__published: // IDE-managed Components + TMainMenu *MainMenu1; + TMenuItem *File1; + TMenuItem *Exit1; + TMenuItem *Option1; + TMenuItem *LocalPath1; + TOpenDialog *localPathDlg; + TPanel *Panel1; + TMediaPlayer *MediaPlayer1; + TImage *Image1; + TPanel *pnlAvailable; + TPanel *pnlInstalled; + TSplitter *Splitter1; + TPanel *Panel2; + TPanel *Panel5; + TPageControl *PageControl1; + TTabSheet *TabSheet1; + TTreeView *localTree; + TPanel *Panel8; + TPanel *Panel7; + TPanel *Panel6; + TTreeView *installTree; + TTimer *Timer1; + TLabel *Label1; + TImageList *ImageList1; + TPanel *Panel3; + TImageList *ImageList2; + TPanel *statusBar; + TPanel *Panel4; + TProgressBar *progressBar; + TSpeedButton *SpeedButton2; + TImage *Image2; + TLabel *Label2; + TMenuItem *ManageRemoteSources1; + TSpeedButton *SpeedButton1; + TSpeedButton *SpeedButton3; + TSpeedButton *SpeedButton4; + TSpeedButton *SpeedButton5; + TSpeedButton *SpeedButton6; + TSpeedButton *SpeedButton7; + TMenuItem *View1; + TMenuItem *LockedModules1; + TMenuItem *Help1; + TMenuItem *Contents1; + void __fastcall LocalPath1Click(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall Button5Click(TObject *Sender); + void __fastcall localTreeDblClick(TObject *Sender); + void __fastcall Button6Click(TObject *Sender); + void __fastcall Image1Click(TObject *Sender); + void __fastcall Button4Click(TObject *Sender); + void __fastcall Button2Click(TObject *Sender); + void __fastcall SpeedButton1Click(TObject *Sender); + void __fastcall SpeedButton5Click(TObject *Sender); + void __fastcall Exit1Click(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall LockedModules1Click(TObject *Sender); + void __fastcall Contents1Click(TObject *Sender); + +private: // User declarations + + SWMgr *manager; + SWConfig *installConf; + const char *getLocalDir(); + void setLocalDir(const char *idir); + void refreshPageControl(); + void addSource(InstallSourceTab *ist); + void fillAllSourceTrees(); + void deleteAllModules(); + +public: // User declarations + __fastcall TMainForm(TComponent* Owner); + __fastcall ~TMainForm(); + void __fastcall RefreshRemoteSource(TObject *Sender); + int selectAll(TTreeView *tree, bool sel); + int removeModule(const char *modName); + int installModule(const char *modName, InstallSourceTab *ist = 0); + static int createParent(const char *pName); + int createPathAndFile(const char *fName); + int copyFile(const char *sourceFile, const char *targetFile); + int copyFileToCWD(const char *sourceDir, const char *fName); + int FTPCopy(InstallSourceTab *ist, const char *src, const char *dest, bool dirTransfer = false, const char *suffix = ""); + SWMgr *localMgr; + bool passive; + +protected: + virtual void fillInstallTree(); + virtual void fillSourceTree(const char *sourceConf, TTreeView *tree); +}; + +//--------------------------------------------------------------------------- +extern PACKAGE TMainForm *MainForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp new file mode 100644 index 0000000..148a7fd --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp @@ -0,0 +1,160 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "RemoteMntFrm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" + +TRemoteMntForm *RemoteMntForm; + + +class TRemoteSource : public TObject { +public: + string name; + string machine; + string dir; + TRemoteSource(const char *confEnt) { + char *buf = new char [ strlen(confEnt) + 1 ]; + + strcpy(buf, confEnt); + + name = strtok(buf, "|"); + machine = strtok(0, "|"); + dir = strtok(0, "|"); + delete [] buf; + } + string getConfEnt() { + return name +"|" + machine + "|" + dir; + } +}; + + +//--------------------------------------------------------------------------- +__fastcall TRemoteMntForm::TRemoteMntForm(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TRemoteMntForm::FormShow(TObject *Sender) +{ + ConfigEntMap::iterator loop, end; + config = new SWConfig("./InstallMgr.conf"); + ListBox1->Clear(); + loop = config->Sections["Sources"].lower_bound("FTPSource"); + end = config->Sections["Sources"].upper_bound("FTPSource"); + while (loop != end) { + TRemoteSource *rs = new TRemoteSource(loop->second.c_str()); + ListBox1->Items->AddObject(rs->name.c_str(), rs); + loop++; + } + ListBox1->ItemIndex = 0; + ListBox1Click(0); + CheckBox1->Checked = (!stricmp((*config)["General"]["PassiveFTP"].c_str(), "true")); + checkDisabled(); +} + + +void TRemoteMntForm::checkDisabled() { + bool enabled = ListBox1->Items->Count; + NameEdit->Enabled = enabled; + MachineEdit->Enabled = enabled; + DirEdit->Enabled = enabled; +} + + +//--------------------------------------------------------------------------- +void __fastcall TRemoteMntForm::FormClose(TObject *Sender, + TCloseAction &Action) +{ + delete config; +} + + +void __fastcall TRemoteMntForm::SpeedButton4Click(TObject *Sender) +{ + ModalResult = mrCancel; +} + + +void __fastcall TRemoteMntForm::ListBox1Click(TObject *Sender) +{ + if (ListBox1->ItemIndex >= 0) { + TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex]; + + NameEdit->Text = rs->name.c_str(); + MachineEdit->Text = rs->machine.c_str(); + DirEdit->Text = rs->dir.c_str(); + } + else { + NameEdit->Text = ""; + MachineEdit->Text = ""; + DirEdit->Text = ""; + } +} + + +void __fastcall TRemoteMntForm::NameEditChange(TObject *Sender) +{ + if (ListBox1->ItemIndex < 0) + return; + TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex]; + rs->name = NameEdit->Text.c_str(); + ListBox1->Items->Strings[ListBox1->ItemIndex] = rs->name.c_str(); +} + + +void __fastcall TRemoteMntForm::MachineEditChange(TObject *Sender) +{ + if (ListBox1->ItemIndex < 0) + return; + TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex]; + rs->machine = MachineEdit->Text.c_str(); +} + + +void __fastcall TRemoteMntForm::DirEditChange(TObject *Sender) +{ + if (ListBox1->ItemIndex < 0) + return; + TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex]; + rs->dir = DirEdit->Text.c_str(); +} + +void __fastcall TRemoteMntForm::SpeedButton2Click(TObject *Sender) +{ + if (ListBox1->ItemIndex < 0) + return; + int delItem = ListBox1->ItemIndex; + ListBox1->Items->Delete(delItem); + ListBox1->ItemIndex = (delItem < ListBox1->Items->Count) ? delItem : delItem - 1; + checkDisabled(); + ListBox1Click(0); +} +//--------------------------------------------------------------------------- + +void __fastcall TRemoteMntForm::SpeedButton1Click(TObject *Sender) +{ + TRemoteSource *rs = new TRemoteSource("[New Remote Site]|ftp.domain.org|/pub/sword/raw/"); + ListBox1->ItemIndex = ListBox1->Items->AddObject(rs->name.c_str(), rs); + + checkDisabled(); + ListBox1Click(0); +} +//--------------------------------------------------------------------------- + +void __fastcall TRemoteMntForm::SpeedButton3Click(TObject *Sender) +{ + TRemoteSource *rs; + config->Sections["Sources"].erase("FTPSource"); + for (int i = 0; i < ListBox1->Items->Count; i++) { + rs = (TRemoteSource *)ListBox1->Items->Objects[i]; + config->Sections["Sources"].insert(ConfigEntMap::value_type("FTPSource", rs->getConfEnt().c_str())); + } + (*config)["General"]["PassiveFTP"] = (CheckBox1->Checked) ? "true" : "false"; + config->Save(); + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- + diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm Binary files differnew file mode 100644 index 0000000..e2b7c64 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h new file mode 100644 index 0000000..67c825d --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------------- +#ifndef RemoteMntFrmH +#define RemoteMntFrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <Buttons.hpp> +#include <ExtCtrls.hpp> +#include <swconfig.h> +//--------------------------------------------------------------------------- +class TRemoteMntForm : public TForm +{ +__published: // IDE-managed Components + TPanel *Panel1; + TPanel *Panel2; + TPanel *Panel3; + TListBox *ListBox1; + TSpeedButton *SpeedButton1; + TSpeedButton *SpeedButton2; + TEdit *NameEdit; + TEdit *MachineEdit; + TEdit *DirEdit; + TPanel *Panel4; + TSpeedButton *SpeedButton3; + TSpeedButton *SpeedButton4; + TLabel *Label1; + TLabel *Label2; + TLabel *Label3; + TCheckBox *CheckBox1; + void __fastcall FormShow(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall NameEditChange(TObject *Sender); + void __fastcall SpeedButton4Click(TObject *Sender); + void __fastcall ListBox1Click(TObject *Sender); + void __fastcall MachineEditChange(TObject *Sender); + void __fastcall DirEditChange(TObject *Sender); + void __fastcall SpeedButton2Click(TObject *Sender); + void __fastcall SpeedButton1Click(TObject *Sender); + void __fastcall SpeedButton3Click(TObject *Sender); +private: // User declarations + SWConfig *config; + void checkDisabled(); + +public: // User declarations + __fastcall TRemoteMntForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TRemoteMntForm *RemoteMntForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp new file mode 100644 index 0000000..0abc9da --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp @@ -0,0 +1,273 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "StatusFrm.h" +#include "MainFrm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//#pragma link "IdBaseComponent" +//#pragma link "IdComponent" +//#pragma link "IdFTP" +//#pragma link "IdTCPClient" +//#pragma link "IdTCPConnection" +#pragma resource "*.dfm" +TStatusForm *StatusForm; + + + + +struct FtpFile { + char *filename; + FILE *stream; +}; + +int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) +{ + struct FtpFile *out=(struct FtpFile *)stream; + if(out && !out->stream) { + /* open file for writing */ + out->stream=fopen(out->filename, "wb"); + if(!out->stream) + return -1; /* failure, can't open file to write */ + } + return fwrite(buffer, size, nmemb, out->stream); +} + + + + + +//--------------------------------------------------------------------------- +__fastcall TStatusForm::TStatusForm(TComponent* Owner) + : TForm(Owner) { + suffix = ""; + passive = false; + curl_global_init(CURL_GLOBAL_DEFAULT); +} + + +__fastcall TStatusForm::~TStatusForm() { + curl_global_cleanup(); +} + + +//--------------------------------------------------------------------------- +void __fastcall TStatusForm::FormShow(TObject *Sender) +{ + abort = false; + ftpThread = new TFTPThread(ist, src.c_str(), dest.c_str(), dirTransfer, passive, true, suffix.c_str()); + ftpThread->OnTerminate = Cleanup; + ftpThread->Resume(); +} +//--------------------------------------------------------------------------- +__fastcall TStatusForm::TFTPThread::TFTPThread(InstallSourceTab *iist, const char *isrc, const char *idest, bool idirTransfer, bool CreateSuspended, bool ipassive, const char *isuffix) + : TThread(CreateSuspended) +{ + ist = iist; + src = isrc; + dest = idest; + suffix = isuffix; + dirTransfer = idirTransfer; + Priority = tpNormal; + passive = ipassive; + FreeOnTerminate = true; + Synchronize((TThreadMethod)&CreateFTPObject); +} + +__fastcall TStatusForm::TFTPThread::~TFTPThread() +{ +} + + +void __fastcall TStatusForm::TFTPThread::Execute() +{ + CURL *curl; + CURLcode res; + struct FtpFile ftpfile={ + "curl.tar.gz", /* name to store the file as if succesful */ + NULL + }; + + Synchronize((TThreadMethod)&PreConnect); + StatusForm->ftpCon->Host = ist->Source.c_str(); + StatusForm->ftpCon->Username = "ftp"; + StatusForm->ftpCon->Password = "installmgr@user.com"; + StatusForm->ftpCon->Passive = passive; + + + curl = curl_easy_init(); + + if (curl) { + /* Get curl 7.9.2 from sunet.se's FTP site: */ + curl_easy_setopt(curl, CURLOPT_URL, + "ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz"); + /* Define our callback to get called when there's data to be written */ + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); + /* Set a pointer to our struct to pass to the callback */ + curl_easy_setopt(curl, CURLOPT_FILE, &ftpfile); + + /* Switch on full protocol/debug output */ + curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); + + res = curl_easy_perform(curl); + + /* always cleanup */ + curl_easy_cleanup(curl); + + if(CURLE_OK != res) { + /* we failed */ + fprintf(stderr, "curl told us %d\n", res); + } + } + + if(ftpfile.stream) + fclose(ftpfile.stream); /* close the local file */ + +/* + try { + StatusForm->ftpCon->Connect(true, -1); + StatusForm->ftpCon->TransferType = ftBinary; + StatusForm->ftpCon->ChangeDir(ist->Directory.c_str()); + } + catch(...) { + MessageBox(0, "Can't connect. Please check your configuration.", "Connection Error", MB_OK); + StatusForm->Button1Click(0); // abort thread + } + + if (!Terminated) { + if (dirTransfer) { + StatusForm->ftpCon->ChangeDir(src.c_str()); + TStringList *dirText = new TStringList(); + StatusForm->ftpCon->List(dirText, "*", true); + TIdFTPListItems *dirList = StatusForm->ftpCon->DirectoryListing; + for (int i = 0; i < dirList->Count; i++) { + if (dirList->Items[i]->ItemType != ditDirectory) { + buffer = dest + "/" + (dirList->Items[i]->FileName.c_str()); +// files->Strings[i].c_str(); + if (!strcmp(&buffer.c_str()[buffer.length()-suffix.length()], suffix.c_str())) { + buffer2 = "Downloading ("; + buffer2 += IntToStr(i+1).c_str(); + buffer2 += " of "; + buffer2 += IntToStr(dirList->Count).c_str(); + buffer2 += "): "; + buffer2 += (dirList->Items[i]->FileName.c_str()); + // SWLog::systemlog->LogInformation("%s", buffer.c_str()); + TMainForm::createParent(buffer.c_str()); // make sure parent directory exists + Synchronize((TThreadMethod)&PreDownload1); + try { + StatusForm->currentFileSize = dirList->Items[i]->Size; + StatusForm->ftpCon->Get(dirList->Items[i]->FileName.c_str(), buffer.c_str(), true, false); + } + catch(...) { + MessageBox(0, "Can't download file. If you have not done so recently, you might try pressing the Refresh from Remote Source button.", "Download Error", MB_OK); + StatusForm->Button1Click(0); // abort thread + } + if (Terminated) + break; + } + } + } + } + else { + Synchronize((TThreadMethod)&PreDownload2); + try { + StatusForm->ftpCon->Get(src.c_str(), dest.c_str(), true, false); + } + catch(...) {StatusForm->abort = true;} + } + try { + StatusForm->ftpCon->Disconnect(); + } + catch(...){} + } +*/ +} + + +void __fastcall TStatusForm::TFTPThread::FTPLinkPacketRecvd(TObject *Sender) +{ +// Synchronize((TThreadMethod)&UpdateBytes); +} + + +//void __fastcall TStatusForm::TFTPThread::UpdateBytes(void) { +void __fastcall TStatusForm::UpdateBytes(void) { + StatusForm->statusBar->Caption = IntToStr(StatusForm->currentByteCount) + " bytes out of " + IntToStr(StatusForm->currentFileSize) + " transferred (" + IntToStr((int)((float)(StatusForm->currentByteCount + 1) / (float)(StatusForm->currentFileSize + 1) * 100)) + "%)"; + StatusForm->statusBar->Repaint(); +} + + +void __fastcall TStatusForm::TFTPThread::CreateFTPObject(void) +{ +// FTPLink = new TNMFTP(0); +} + + +void __fastcall TStatusForm::TFTPThread::PreConnect(void) +{ + buffer = "Connecting to server at "; + buffer += ist->Source.c_str(); + buffer += "..."; + StatusForm->actionBar->Caption = buffer.c_str(); + StatusForm->statusBar->Caption = ""; + StatusForm->Repaint(); +} + + +void __fastcall TStatusForm::TFTPThread::PreDownload1(void) +{ +// SWLog::systemlog->LogInformation("Creating parent dir: %s", buffer.c_str()); +// SWLog::systemlog->LogInformation("Return: %d", ret); + StatusForm->actionBar->Caption = buffer2.c_str(); + StatusForm->statusBar->Caption = ""; + StatusForm->Repaint(); +} + + +void __fastcall TStatusForm::TFTPThread::PreDownload2(void) +{ + buffer = "Downloading: "; + buffer += src.c_str(); + StatusForm->actionBar->Caption = buffer.c_str(); + StatusForm->statusBar->Caption = ""; + StatusForm->Repaint(); + MainForm->createParent(dest.c_str()); // make sure parent directory exists +} + + +void __fastcall TStatusForm::Cleanup(TObject *Sender) +//void __fastcall TStatusForm::TFTPThread::Cleanup() +{ + if (abort) + StatusForm->ModalResult = mrCancel; + else StatusForm->ModalResult = mrOk; +// StatusForm->Close(); +} + +void __fastcall TStatusForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + suffix = ""; + MainForm->SetFocus(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStatusForm::Button1Click(TObject *Sender) +{ + abort = true; +// ftpCon->Abort(); + ftpThread->Terminate(); +} +//--------------------------------------------------------------------------- + +/* +void __fastcall TStatusForm::ftpConWork(TObject *Sender, + TWorkMode AWorkMode, const int AWorkCount) +{ + currentByteCount = AWorkCount; +// Synchronize((TThreadMethod)&UpdateBytes); + UpdateBytes(); +} +*/ +//--------------------------------------------------------------------------- + diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm Binary files differnew file mode 100644 index 0000000..bf8609e --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h new file mode 100644 index 0000000..d4b2094 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h @@ -0,0 +1,89 @@ +//--------------------------------------------------------------------------- +#ifndef StatusFrmH +#define StatusFrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <ExtCtrls.hpp> +//#include <NMFtp.hpp> +#include "MainFrm.h" +//#include "IdBaseComponent.hpp" +//#include "IdComponent.hpp" +//#include "IdFTP.hpp" +//#include "IdTCPClient.hpp" +//#include "IdTCPConnection.hpp" +#include <curl/curl.h> +#include <curl/types.h> +#include <curl/easy.h> +//--------------------------------------------------------------------------- + +class TFTPCon { +public: + string Host; + string Username; + string Password; + bool Passive; + string cwd; + +}; + +class TStatusForm : public TForm +{ +__published: // IDE-managed Components + TPanel *Panel1; + TPanel *Panel2; + TButton *Button1; + TPanel *statusBar; + TPanel *Panel3; + TPanel *actionBar; + void __fastcall FormShow(TObject *Sender); + void __fastcall Cleanup(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall Button1Click(TObject *Sender); +// void __fastcall ftpConWork(TObject *Sender, TWorkMode AWorkMode, +// const int AWorkCount); +private: // User declarations + class TFTPThread : public TThread { + bool abort; + InstallSourceTab *ist; + string src; + string dest; + string buffer; + string buffer2; + string suffix; + bool dirTransfer; + bool passive; + protected: + void __fastcall Execute(); + public: +// TNMFTP *FTPLink; + __fastcall TFTPThread(InstallSourceTab *iist, const char *isrc, const char *idest, bool idirTransfer = false, bool CreateSuspended = false, bool ipassive = false, const char *suffix = ""); + __fastcall TFTPThread::~TFTPThread(); + void __fastcall FTPLinkPacketRecvd(TObject *Sender); + void __fastcall CreateFTPObject(void); + void __fastcall PreConnect(void); + void __fastcall PreDownload1(void); + void __fastcall PreDownload2(void); +// void __fastcall Cleanup(void); + } *ftpThread; +public: // User declarations + TFTPCon *ftpCon; + long currentByteCount; + long currentFileSize; + InstallSourceTab *ist; + string src; + string dest; + string suffix; + bool dirTransfer; + bool passive; + bool abort; + void __fastcall UpdateBytes(); + __fastcall TStatusForm(TComponent* Owner); + __fastcall ~TStatusForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TStatusForm *StatusForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp new file mode 100644 index 0000000..98a97d9 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp @@ -0,0 +1,15 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "UninstallFrm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TUninstallForm *UninstallForm; +//--------------------------------------------------------------------------- +__fastcall TUninstallForm::TUninstallForm(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm Binary files differnew file mode 100644 index 0000000..3a2f310 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h new file mode 100644 index 0000000..45fdd7f --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- +#ifndef UninstallFrmH +#define UninstallFrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <ComCtrls.hpp> +#include <ExtCtrls.hpp> +//--------------------------------------------------------------------------- +class TUninstallForm : public TForm +{ +__published: // IDE-managed Components + TPanel *Panel1; + TPanel *Panel2; + TProgressBar *ProgressBar1; + TLabel *Label1; +private: // User declarations +public: // User declarations + __fastcall TUninstallForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TUninstallForm *UninstallForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp b/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp Binary files differnew file mode 100644 index 0000000..8d5713f --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp b/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp Binary files differnew file mode 100644 index 0000000..a1c4068 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/back.bmp b/apps/windoze/CBuilder5/InstallMgr/back.bmp Binary files differnew file mode 100644 index 0000000..966e157 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/back.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp b/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp Binary files differnew file mode 100644 index 0000000..5389910 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp b/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp Binary files differnew file mode 100644 index 0000000..0da70ab --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp b/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp Binary files differnew file mode 100644 index 0000000..61c7e5b --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/check.bmp b/apps/windoze/CBuilder5/InstallMgr/check.bmp Binary files differnew file mode 100644 index 0000000..09307a9 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/check.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp new file mode 100644 index 0000000..5b77797 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp @@ -0,0 +1,67 @@ +//--------------------------------------------------------------------------- +#include <vcl.h> +#pragma hdrstop + +#include "cipherfrm.h" +#include <swmgr.h> +#include <swconfig.h> +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TCipherForm *CipherForm; +//--------------------------------------------------------------------------- +__fastcall TCipherForm::TCipherForm(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TCipherForm::Button2Click(TObject *Sender) +{ + SectionMap::iterator section; + ConfigEntMap::iterator entry; + SWConfig *modconf = new SWConfig(confFile.c_str()); + string tmpBuf; + + section = modconf->Sections.find(modName); + if (section != modconf->Sections.end()) { + entry = section->second.find("CipherKey"); + if (entry != section->second.end()) { + entry->second = CipherForm->cipherEdit->Text.c_str(); + modconf->Save(); + delete modconf; // close file + modconf = 0; + SWMgr *mgr = new SWMgr(); + SWModule *mod = mgr->Modules[modName]; + mod->SetKey("Ipet 2:12"); + tmpBuf = mod->StripText(); + mod->SetKey("gen 1:10"); + tmpBuf += "\r\n\r\n"; + tmpBuf += mod->StripText(); + Memo1->Text = tmpBuf.c_str(); + delete mgr; + } + } + if (modconf) + delete modconf; + +} +//--------------------------------------------------------------------------- + +void __fastcall TCipherForm::FormShow(TObject *Sender) +{ + string tmpCaption; + tmpCaption = "Cipher Key: ["; + tmpCaption += modName; + tmpCaption += "]"; + Caption = tmpCaption.c_str(); +} +//--------------------------------------------------------------------------- + + +void __fastcall TCipherForm::FormClose(TObject *Sender, + TCloseAction &Action) +{ + Memo1->Text = ""; +} +//--------------------------------------------------------------------------- + diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm Binary files differnew file mode 100644 index 0000000..98d9beb --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h new file mode 100644 index 0000000..dba1e59 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h @@ -0,0 +1,37 @@ +//--------------------------------------------------------------------------- +#ifndef cipherfrmH +#define cipherfrmH +//--------------------------------------------------------------------------- +#include <Classes.hpp> +#include <Controls.hpp> +#include <StdCtrls.hpp> +#include <Forms.hpp> +#include <ExtCtrls.hpp> +#include <string> +//--------------------------------------------------------------------------- +class TCipherForm : public TForm +{ +__published: // IDE-managed Components + TPanel *Panel1; + TPanel *Panel2; + TPanel *Panel3; + TLabel *Label1; + TLabel *Label2; + TEdit *cipherEdit; + TMemo *Memo1; + TButton *Button1; + TButton *Button2; + TButton *Button3; + void __fastcall Button2Click(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); +private: // User declarations +public: // User declarations + std::string confFile; + std::string modName; + __fastcall TCipherForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TCipherForm *CipherForm; +//--------------------------------------------------------------------------- +#endif diff --git a/apps/windoze/CBuilder5/InstallMgr/delete.bmp b/apps/windoze/CBuilder5/InstallMgr/delete.bmp Binary files differnew file mode 100644 index 0000000..d20cbf9 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/delete.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/filenew.bmp b/apps/windoze/CBuilder5/InstallMgr/filenew.bmp Binary files differnew file mode 100644 index 0000000..59fb3db --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/filenew.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/floppy.bmp b/apps/windoze/CBuilder5/InstallMgr/floppy.bmp Binary files differnew file mode 100644 index 0000000..5fbef0a --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/floppy.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/globe.bmp b/apps/windoze/CBuilder5/InstallMgr/globe.bmp Binary files differnew file mode 100644 index 0000000..e4b661d --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/globe.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/insert.bmp b/apps/windoze/CBuilder5/InstallMgr/insert.bmp Binary files differnew file mode 100644 index 0000000..7cc35c5 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/insert.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/installmgr.conf b/apps/windoze/CBuilder5/InstallMgr/installmgr.conf new file mode 100644 index 0000000..04a349b --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/installmgr.conf @@ -0,0 +1,8 @@ + +[General] +PassiveFTP=true + +[Sources] +FTPSource=crosswire|ftp.crosswire.org|/pub/sword/raw/ +LocalPath=C:\tmp + diff --git a/apps/windoze/CBuilder5/InstallMgr/query.bmp b/apps/windoze/CBuilder5/InstallMgr/query.bmp Binary files differnew file mode 100644 index 0000000..36cd506 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/query.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/sword.bmp b/apps/windoze/CBuilder5/InstallMgr/sword.bmp Binary files differnew file mode 100644 index 0000000..32c5606 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/sword.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/trash.bmp b/apps/windoze/CBuilder5/InstallMgr/trash.bmp Binary files differnew file mode 100644 index 0000000..effbab9 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/trash.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/undo.bmp b/apps/windoze/CBuilder5/InstallMgr/undo.bmp Binary files differnew file mode 100644 index 0000000..fc4fff6 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/undo.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp b/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp Binary files differnew file mode 100644 index 0000000..4158452 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp diff --git a/apps/windoze/CBuilder5/InstallMgr/zlib.bpf b/apps/windoze/CBuilder5/InstallMgr/zlib.bpf new file mode 100644 index 0000000..a725d34 --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/zlib.bpf @@ -0,0 +1,25 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop +USEUNIT("..\..\..\..\src\utilfuns\zlib\adler32.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\compress.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\crc32.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\deflate.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\gzio.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\infblock.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\infcodes.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\inffast.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\inflate.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\inftrees.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\infutil.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\maketree.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\trees.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\uncompr.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\untgz.c"); +USEUNIT("..\..\..\..\src\utilfuns\zlib\zutil.c"); +//--------------------------------------------------------------------------- +#define Library + +// To add a file to the library use the Project menu 'Add to Project'. + diff --git a/apps/windoze/CBuilder5/InstallMgr/zlib.bpr b/apps/windoze/CBuilder5/InstallMgr/zlib.bpr new file mode 100644 index 0000000..635316b --- /dev/null +++ b/apps/windoze/CBuilder5/InstallMgr/zlib.bpr @@ -0,0 +1,126 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- C++Builder XML Project --> +<PROJECT> + <MACROS> + <VERSION value="BCB.05.03"/> + <PROJECT value="zlib.lib"/> + <OBJFILES value="..\..\..\..\src\utilfuns\zlib\adler32.obj + ..\..\..\..\src\utilfuns\zlib\compress.obj + ..\..\..\..\src\utilfuns\zlib\crc32.obj + ..\..\..\..\src\utilfuns\zlib\deflate.obj + ..\..\..\..\src\utilfuns\zlib\gzio.obj + ..\..\..\..\src\utilfuns\zlib\infblock.obj + ..\..\..\..\src\utilfuns\zlib\infcodes.obj + ..\..\..\..\src\utilfuns\zlib\inffast.obj + ..\..\..\..\src\utilfuns\zlib\inflate.obj + ..\..\..\..\src\utilfuns\zlib\inftrees.obj + ..\..\..\..\src\utilfuns\zlib\infutil.obj + ..\..\..\..\src\utilfuns\zlib\maketree.obj + ..\..\..\..\src\utilfuns\zlib\trees.obj + ..\..\..\..\src\utilfuns\zlib\uncompr.obj + ..\..\..\..\src\utilfuns\zlib\untgz.obj + ..\..\..\..\src\utilfuns\zlib\zutil.obj"/> + <RESFILES value=""/> + <IDLFILES value=""/> + <IDLGENFILES value=""/> + <DEFFILE value=""/> + <RESDEPEN value="$(RESFILES)"/> + <LIBFILES value=""/> + <LIBRARIES value=""/> + <PACKAGES value=""/> + <PATHCPP value=".;..\..\..\..\src\utilfuns\zlib"/> + <PATHPAS value=".;"/> + <PATHRC value=".;"/> + <PATHASM value=".;"/> + <LINKER value="TLib"/> + <USERDEFINES value=""/> + <SYSDEFINES value="_RTLDLL;NO_STRICT"/> + <MAINSOURCE value="zlib.bpf"/> + <INCLUDEPATH value="..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include"/> + <LIBPATH value="..\..\..\..\src\utilfuns\zlib;$(BCB)\lib\obj;$(BCB)\lib"/> + <WARNINGS value="-w-par"/> + <LISTFILE value=""/> + </MACROS> + <OPTIONS> + <IDLCFLAGS value="-I..\..\..\..\src\utilfuns\zlib -I$(BCB)\include -I$(BCB)\include\vcl + -I..\..\..\..\include -src_suffix cpp -boa"/> + <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tW -tWM"/> + <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/> + <AFLAGS value="/mx /w2 /zn"/> + <LFLAGS value=""/> + </OPTIONS> + <LINKER> + <ALLOBJ value="$(OBJFILES)"/> + <ALLLIB value=""/> + </LINKER> + <IDEOPTIONS> +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include +Item1=..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=1 +Item0=..\..\..\..\src\utilfuns\zlib;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + </IDEOPTIONS> +</PROJECT>
\ No newline at end of file |